This is the code for the statistical analysis for “Vowel Acoustics as Predictors of Speech Intelligibility in Dysarthria.”
Loading Packages
remotes::install_github("AllanCameron/geomtextpath")
Downloading GitHub repo AllanCameron/geomtextpath@HEAD
These packages have more recent versions available.
It is recommended to update all of them.
Which would you like to update?
1: All
2: CRAN packages only
3: None
4: cpp11 (0.3.1 -> 0.4.2 ) [CRAN]
5: colorspace (2.0-0 -> 2.0-3 ) [CRAN]
6: rlang (0.4.11 -> 1.0.2 ) [CRAN]
7: glue (1.4.2 -> 1.6.2 ) [CRAN]
8: crayon (1.4.1 -> 1.5.1 ) [CRAN]
9: cli (3.0.1 -> 3.2.0 ) [CRAN]
10: vctrs (0.3.8 -> 0.4.1 ) [CRAN]
11: pillar (1.6.2 -> 1.7.0 ) [CRAN]
12: magrittr (2.0.1 -> 2.0.3 ) [CRAN]
13: lifecycle (1.0.0 -> 1.0.1 ) [CRAN]
14: fansi (0.5.0 -> 1.0.3 ) [CRAN]
15: viridisLite (0.3.0 -> 0.4.0 ) [CRAN]
16: RColorBrewer (1.1-2 -> 1.1-3 ) [CRAN]
17: R6 (2.5.0 -> 2.5.1 ) [CRAN]
18: farver (2.0.3 -> 2.1.0 ) [CRAN]
19: withr (2.4.1 -> 2.5.0 ) [CRAN]
20: tibble (3.1.3 -> 3.1.6 ) [CRAN]
21: scales (1.1.1 -> 1.2.0 ) [CRAN]
22: isoband (0.2.3 -> 0.2.5 ) [CRAN]
23: digest (0.6.27 -> 0.6.29) [CRAN]
1
cpp11 (0.3.1 -> 0.4.2 ) [CRAN]
colorspace (2.0-0 -> 2.0-3 ) [CRAN]
rlang (0.4.11 -> 1.0.2 ) [CRAN]
glue (1.4.2 -> 1.6.2 ) [CRAN]
crayon (1.4.1 -> 1.5.1 ) [CRAN]
cli (3.0.1 -> 3.2.0 ) [CRAN]
vctrs (0.3.8 -> 0.4.1 ) [CRAN]
pillar (1.6.2 -> 1.7.0 ) [CRAN]
magrittr (2.0.1 -> 2.0.3 ) [CRAN]
lifecycle (1.0.0 -> 1.0.1 ) [CRAN]
fansi (0.5.0 -> 1.0.3 ) [CRAN]
viridisLite (0.3.0 -> 0.4.0 ) [CRAN]
RColorBrewer (1.1-2 -> 1.1-3 ) [CRAN]
R6 (2.5.0 -> 2.5.1 ) [CRAN]
farver (2.0.3 -> 2.1.0 ) [CRAN]
systemfonts (NA -> 1.0.4 ) [CRAN]
withr (2.4.1 -> 2.5.0 ) [CRAN]
tibble (3.1.3 -> 3.1.6 ) [CRAN]
scales (1.1.1 -> 1.2.0 ) [CRAN]
isoband (0.2.3 -> 0.2.5 ) [CRAN]
digest (0.6.27 -> 0.6.29) [CRAN]
textshaping (NA -> 0.3.6 ) [CRAN]
Installing 22 packages: cpp11, colorspace, rlang, glue, crayon, cli, vctrs, pillar, magrittr, lifecycle, fansi, viridisLite, RColorBrewer, R6, farver, systemfonts, withr, tibble, scales, isoband, digest, textshaping
There are binary versions available but the source versions are later:
yes
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/cpp11_0.4.2.tgz'
Content type 'application/x-gzip' length 304354 bytes (297 KB)
==================================================
downloaded 297 KB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/colorspace_2.0-3.tgz'
Content type 'application/x-gzip' length 2623631 bytes (2.5 MB)
==================================================
downloaded 2.5 MB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/rlang_1.0.2.tgz'
Content type 'application/x-gzip' length 1777779 bytes (1.7 MB)
==================================================
downloaded 1.7 MB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/glue_1.6.2.tgz'
Content type 'application/x-gzip' length 151788 bytes (148 KB)
==================================================
downloaded 148 KB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/crayon_1.5.1.tgz'
Content type 'application/x-gzip' length 158468 bytes (154 KB)
==================================================
downloaded 154 KB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/cli_3.2.0.tgz'
Content type 'application/x-gzip' length 1151378 bytes (1.1 MB)
==================================================
downloaded 1.1 MB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/pillar_1.7.0.tgz'
Content type 'application/x-gzip' length 742687 bytes (725 KB)
==================================================
downloaded 725 KB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/magrittr_2.0.3.tgz'
Content type 'application/x-gzip' length 227333 bytes (222 KB)
==================================================
downloaded 222 KB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/lifecycle_1.0.1.tgz'
Content type 'application/x-gzip' length 105818 bytes (103 KB)
==================================================
downloaded 103 KB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/fansi_1.0.3.tgz'
Content type 'application/x-gzip' length 364286 bytes (355 KB)
==================================================
downloaded 355 KB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/viridisLite_0.4.0.tgz'
Content type 'application/x-gzip' length 1296423 bytes (1.2 MB)
==================================================
downloaded 1.2 MB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/RColorBrewer_1.1-3.tgz'
Content type 'application/x-gzip' length 53084 bytes (51 KB)
==================================================
downloaded 51 KB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/R6_2.5.1.tgz'
Content type 'application/x-gzip' length 82455 bytes (80 KB)
==================================================
downloaded 80 KB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/farver_2.1.0.tgz'
Content type 'application/x-gzip' length 1950011 bytes (1.9 MB)
==================================================
downloaded 1.9 MB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/systemfonts_1.0.4.tgz'
Content type 'application/x-gzip' length 5900638 bytes (5.6 MB)
==================================================
downloaded 5.6 MB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/withr_2.5.0.tgz'
Content type 'application/x-gzip' length 228814 bytes (223 KB)
==================================================
downloaded 223 KB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/tibble_3.1.6.tgz'
Content type 'application/x-gzip' length 846334 bytes (826 KB)
==================================================
downloaded 826 KB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/isoband_0.2.5.tgz'
Content type 'application/x-gzip' length 3379423 bytes (3.2 MB)
==================================================
downloaded 3.2 MB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/digest_0.6.29.tgz'
Content type 'application/x-gzip' length 298444 bytes (291 KB)
==================================================
downloaded 291 KB
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/textshaping_0.3.6.tgz'
Content type 'application/x-gzip' length 1291860 bytes (1.2 MB)
==================================================
downloaded 1.2 MB
The downloaded binary packages are in
/var/folders/2s/c8b_6s1s5tgcqqt271kpjw4r0000gn/T//RtmpUSDfWl/downloaded_packages
installing the source packages ‘vctrs’, ‘scales’
trying URL 'https://cran.rstudio.com/src/contrib/vctrs_0.4.1.tar.gz'
Content type 'application/x-gzip' length 916782 bytes (895 KB)
==================================================
downloaded 895 KB
trying URL 'https://cran.rstudio.com/src/contrib/scales_1.2.0.tar.gz'
Content type 'application/x-gzip' length 270188 bytes (263 KB)
==================================================
downloaded 263 KB
* installing *source* package ‘vctrs’ ...
** package ‘vctrs’ successfully unpacked and MD5 sums checked
** using staged installation
** libs
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c altrep-rle.c -o altrep-rle.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c altrep.c -o altrep.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c arg-counter.c -o arg-counter.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c arg.c -o arg.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c assert.c -o assert.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c bind.c -o bind.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c c-unchop.c -o c-unchop.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c c.c -o c.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c callables.c -o callables.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c cast-bare.c -o cast-bare.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c cast-dispatch.c -o cast-dispatch.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c cast.c -o cast.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c compare.c -o compare.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c complete.c -o complete.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c conditions.c -o conditions.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c dictionary.c -o dictionary.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c dim.c -o dim.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c empty.c -o empty.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c equal.c -o equal.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c fields.c -o fields.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c fill.c -o fill.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c globals.c -o globals.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c group.c -o group.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c growable.c -o growable.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c hash.c -o hash.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c init.c -o init.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c interval.c -o interval.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c match-joint.c -o match-joint.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c match.c -o match.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c names.c -o names.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c order-collate.c -o order-collate.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c order-groups.c -o order-groups.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c order-sortedness.c -o order-sortedness.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c order-truelength.c -o order-truelength.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c order.c -o order.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c poly-op.c -o poly-op.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c proxy-restore.c -o proxy-restore.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c proxy.c -o proxy.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c ptype-common.c -o ptype-common.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c ptype.c -o ptype.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c ptype2-dispatch.c -o ptype2-dispatch.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c ptype2.c -o ptype2.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c rank.c -o rank.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c rep.c -o rep.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c rlang-dev.c -o rlang-dev.o
clang++ -mmacosx-version-min=10.13 -std=gnu++11 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c rlang-rcc.cpp -o rlang-rcc.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c rlang.c -o rlang.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c runs.c -o runs.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c shape.c -o shape.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c size-common.c -o size-common.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c size.c -o size.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c slice-array.c -o slice-array.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c slice-assign-array.c -o slice-assign-array.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c slice-assign.c -o slice-assign.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c slice-chop.c -o slice-chop.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c slice-interleave.c -o slice-interleave.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c slice.c -o slice.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c split.c -o split.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c subscript-loc.c -o subscript-loc.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c subscript.c -o subscript.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c translate.c -o translate.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c type-data-frame.c -o type-data-frame.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c type-date-time.c -o type-date-time.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c type-factor.c -o type-factor.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c type-info.c -o type-info.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c type-integer64.c -o type-integer64.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c type-tibble.c -o type-tibble.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c typeof2-s3.c -o typeof2-s3.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c typeof2.c -o typeof2.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c unspecified.c -o unspecified.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c utils-dispatch.c -o utils-dispatch.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c utils.c -o utils.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c vctrs-core.c -o vctrs-core.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang -I/usr/local/include -fPIC -Wall -g -O2 -c version.c -o version.o
clang++ -mmacosx-version-min=10.13 -std=gnu++11 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o vctrs.so altrep-rle.o altrep.o arg-counter.o arg.o assert.o bind.o c-unchop.o c.o callables.o cast-bare.o cast-dispatch.o cast.o compare.o complete.o conditions.o dictionary.o dim.o empty.o equal.o fields.o fill.o globals.o group.o growable.o hash.o init.o interval.o match-joint.o match.o names.o order-collate.o order-groups.o order-sortedness.o order-truelength.o order.o poly-op.o proxy-restore.o proxy.o ptype-common.o ptype.o ptype2-dispatch.o ptype2.o rank.o rep.o rlang-dev.o rlang-rcc.o rlang.o runs.o shape.o size-common.o size.o slice-array.o slice-assign-array.o slice-assign.o slice-chop.o slice-interleave.o slice.o split.o subscript-loc.o subscript.o translate.o type-data-frame.o type-date-time.o type-factor.o type-info.o type-integer64.o type-tibble.o typeof2-s3.o typeof2.o unspecified.o utils-dispatch.o utils.o vctrs-core.o version.o -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
ld: warning: object file (altrep-rle.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (altrep.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (arg.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (arg-counter.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (assert.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (bind.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (c-unchop.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (c.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (callables.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (cast.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (cast-dispatch.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (cast-bare.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (complete.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (compare.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (conditions.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (dictionary.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (dim.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (empty.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (equal.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (fields.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (fill.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (globals.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (group.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (growable.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (hash.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (interval.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (init.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (match-joint.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (match.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (names.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (order-collate.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (order-groups.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (order-sortedness.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (order-truelength.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (order.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (poly-op.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (proxy-restore.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (proxy.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (ptype-common.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (ptype.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (ptype2-dispatch.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (ptype2.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (rank.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (rep.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (rlang-dev.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (rlang.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (runs.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (shape.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (size-common.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (size.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (slice-array.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (slice-assign-array.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (slice-assign.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (slice-chop.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (slice-interleave.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (slice.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (split.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (subscript-loc.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (subscript.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (translate.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (type-data-frame.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (type-date-time.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (type-factor.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (type-info.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (type-integer64.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (type-tibble.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (typeof2-s3.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (typeof2.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (unspecified.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (utils-dispatch.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (utils.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (vctrs-core.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (version.o) was built for newer macOS version (12.0) than being linked (10.13)
installing to /Library/Frameworks/R.framework/Versions/4.0/Resources/library/00LOCK-vctrs/00new/vctrs/libs
** R
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
*** copying figures
** building package indices
** installing vignettes
** testing if installed package can be loaded from temporary location
** checking absolute paths in shared objects and dynamic libraries
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (vctrs)
* installing *source* package ‘scales’ ...
** package ‘scales’ successfully unpacked and MD5 sums checked
** using staged installation
** R
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
*** copying figures
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (scales)
The downloaded source packages are in
‘/private/var/folders/2s/c8b_6s1s5tgcqqt271kpjw4r0000gn/T/RtmpUSDfWl/downloaded_packages’
checking for file ‘/private/var/folders/2s/c8b_6s1s5tgcqqt271kpjw4r0000gn/T/RtmpUSDfWl/remotesa2175ff1c30/AllanCameron-geomtextpath-f11e256/DESCRIPTION’ ...
✓ checking for file ‘/private/var/folders/2s/c8b_6s1s5tgcqqt271kpjw4r0000gn/T/RtmpUSDfWl/remotesa2175ff1c30/AllanCameron-geomtextpath-f11e256/DESCRIPTION’ (360ms)
─ preparing ‘geomtextpath’:
checking DESCRIPTION meta-information ...
✓ checking DESCRIPTION meta-information
─ checking for LF line-endings in source and make files and shell scripts
─ checking for empty or unneeded directories
─ building ‘geomtextpath_0.1.0.9000.tar.gz’
* installing *source* package ‘geomtextpath’ ...
** using staged installation
** R
** data
*** moving datasets to lazyload DB
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
*** copying figures
** building package indices
** installing vignettes
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (geomtextpath)
Upload Datasets
Reliability <- rio::import("Prepped Data/Reliability Data.csv")
AcousticData <- rio::import("Prepped Data/AcousticMeasures.csv") %>%
dplyr::mutate(intDiff = VAS - transAcc)
AcousticData <- AcousticData %>%
dplyr::filter(!grepl("_rel", Speaker)) %>%
dplyr::select(c(Speaker, Sex, Etiology, vowel_ED_b, VSA_b, Hull_b, Hull_bVSD_25, Hull_bVSD_50, Hull_bVSD_75, VAS, transAcc))
Listeners <- rio::import("Prepped Data/Listener_Demographics.csv") %>%
dplyr::select(!c(StartDate:proloficID, Q2.4_6_TEXT, Q3.2_8_TEXT, AudioCheck:EP3))
Listeners$race[Listeners$Q3.3_7_TEXT == "Native American/ African amercing"] <- "Biracial or Multiracial"
Inter-rater Reliability
Two raters (the first two authors) completed vowel segmentation for the speakers. To calculate inter-rater reliability, 20% of the speakers were segmented again by the other rater. Two-way intraclass coefficients were computed for the extracted F1 and F2 from the temporal midpoint of the vowel segments. Since only one set of ratings will be used in the data analysis, we focus on the single ICC results and interpretation. However, we also report the average ICC values to be comprehensive.
## Creating new data frames to calculate ICC for extracted F1 and F2 values
F1_Rel <- Reliability %>%
dplyr::select(c(F1, F1_rel))
F2_Rel <- Reliability %>%
dplyr::select(c(F2, F2_rel))
## Single ICC for F1
Single_F1 <- irr::icc(F1_Rel, model = "twoway", type = "agreement", unit = "single")
## Average ICC for F1
Average_F1 <- irr::icc(F1_Rel, model = "twoway", type = "agreement", unit = "average")
## Single ICC for F2
Single_F2 <- irr::icc(F2_Rel, model = "twoway", type = "agreement", unit = "single")
## Average ICC for F2
Average_F2 <- irr::icc(F2_Rel, model = "twoway", type = "agreement", unit = "average")
## Inter-rater reliability results and interpretation
print(paste("Single ICC for F1 is ", round(Single_F1$value, digits = 3), ". ",
"The 95% CI is [", round(Single_F1$lbound, digits = 3), " - ", round(Single_F1$ubound, digits = 3), "].", sep = ""))
[1] "Single ICC for F1 is 0.866. The 95% CI is [0.837 - 0.89]."
print(paste("Single ICC for F2 is ", round(Single_F2$value, digits = 3), ". ",
"The 95% CI is [", round(Single_F2$lbound, digits = 3), " - ", round(Single_F2$ubound, digits = 3), "].", sep = ""))
[1] "Single ICC for F2 is 0.931. The 95% CI is [0.916 - 0.944]."
print(paste("Average ICC for F1 is ", round(Average_F1$value, digits = 3), ". ",
"The 95% CI is [", round(Average_F1$lbound, digits = 3), " - ", round(Average_F1$ubound, digits = 3), "].", sep = ""))
[1] "Average ICC for F1 is 0.928. The 95% CI is [0.911 - 0.942]."
print(paste("Average ICC for F2 is ", round(Average_F2$value, digits = 3), ". ",
"The 95% CI is [", round(Average_F2$lbound, digits = 3), " - ", round(Average_F2$ubound, digits = 3), "].", sep = ""))
[1] "Average ICC for F2 is 0.964. The 95% CI is [0.956 - 0.971]."
print("Thus, interrater reliability for the extracted F1 and F2 values from the vowel segments was good to excellent.")
[1] "Thus, interrater reliability for the extracted F1 and F2 values from the vowel segments was good to excellent."
## Removing extra data frames from environment
rm(F1_Rel, F2_Rel, Reliability, Single_F1, Single_F2, Average_F1, Average_F2)
Descriptive Statistics
Means and SD
Descriptives <- AcousticData %>%
dplyr::group_by(Sex, Etiology) %>%
dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))
DescriptivesbySex <- AcousticData %>%
dplyr::group_by(Sex) %>%
dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))
DescriptivesbyEtiology <- AcousticData %>%
dplyr::group_by(Etiology) %>%
dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))
Descriptives
DescriptivesbySex
DescriptivesbyEtiology
Correlations among variables
CorrMatrix1 <- AcousticData %>%
dplyr::select(VSA_b, vowel_ED_b, Hull_b, Hull_bVSD_25, Hull_bVSD_50, Hull_bVSD_75, VAS, transAcc) %>%
corrr::correlate()
CorrMatrix1
Data Vis
Group Comparisons: Ridgeline Plots
# Vowel Space Area Distribution by Etiology
VSA_plot <- AcousticData %>%
ggplot() +
aes(x = VSA_b,
y = Etiology,
color = Etiology,
fill = Etiology) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Vowel Space Area (Bark)") +
theme_classic()
## Corner Dispersion Distribution by Etiology
disp_plot <- AcousticData %>%
ggplot() +
aes(x = vowel_ED_b,
y = Etiology,
color = Etiology,
fill = Etiology) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Corner Dispersion (Bark)") +
theme_classic()
# Vowel Space Hull Distribution by Etiology
Hull_plot <- AcousticData %>%
ggplot() +
aes(x = Hull_b,
y = Etiology,
color = Etiology,
fill = Etiology) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Vowel Space Hull (Bark)") +
theme_classic()
# Vowel Space Density 25 Distribution by Etiology
vsd_25_plot <- AcousticData %>%
ggplot() +
aes(x = Hull_bVSD_25,
y = Etiology,
color = Etiology,
fill = Etiology) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Vowel Space Denisty 25 (Bark)") +
theme_classic()
# Vowel Space Density 50 Distribution by Etiology
vsd_50_plot <- AcousticData %>%
ggplot() +
aes(x = Hull_bVSD_50,
y = Etiology,
color = Etiology,
fill = Etiology) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Vowel Space Denisty 50 (Bark)") +
theme_classic()
# Vowel Space Density 75 Distribution by Etiology
vsd_75_plot <- AcousticData %>%
ggplot() +
aes(x = Hull_bVSD_75,
y = Etiology,
color = Etiology,
fill = Etiology) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
expand_limits(x=0) +
xlab("Vowel Space Denisty 75 (Bark)") +
theme_classic()
# Visual Analog Scale Intelligibility Rating Distribution by Etiology
VAS_plot <- AcousticData %>%
ggplot() +
aes(x = VAS,
y = Etiology,
color = Etiology,
fill = Etiology) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Visual Analog Scale (VAS)") +
theme_classic()
# Orthographic Transcription Score Distribution by Etiology
OT_plot <- AcousticData %>%
ggplot() +
aes(x = transAcc,
y = Etiology,
color = Etiology,
fill = Etiology) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
coord_cartesian(xlim = c(0, 100)) +
xlab("Orthographic Transcription Scores") +
theme_classic()
# Creating Distributions Figure
Distributions <- ggpubr::ggarrange(VSA_plot, disp_plot, Hull_plot, vsd_25_plot, vsd_50_plot, vsd_75_plot, VAS_plot, OT_plot,
ncol = 2,
nrow = 4)
# Saving Distribution Figure
ggsave("Plots/Distribution.png", plot = last_plot(), width = 10, height = 10, unit = "in")
Scatter Plots

OT ~ VAS Plot

Group Comparisons
VSA
## Specify the Model
VSA_group <- aov(VSA_b ~ Etiology, data = AcousticData)
## Assumption Check
plot(VSA_group, 1)
plot(VSA_group, 2)
car::leveneTest(VSA_group)
VSA_residuals <- residuals(object = VSA_group)
shapiro.test(VSA_residuals)
## Model Results
summary(VSA_group)
## Kruskal-Wallis Test
kruskal.test(VSA_b ~ Etiology, data = AcousticData)
## Pairwise Comparisons
pairwise.wilcox.test(AcousticData$VSA_b, AcousticData$Etiology, p.adjust.method = "bonferroni")
Corner Dispersion
## Specify the Model
disp_group <- aov(vowel_ED_b ~ Etiology, data = AcousticData)
## Assumption Check
plot(disp_group, 1)
plot(disp_group, 2)
car::leveneTest(disp_group)
disp_residuals <- residuals(object = disp_group)
shapiro.test(disp_residuals)
## Model Results
summary(disp_group)
Hull
## Specify the Model
hull_group <- aov(Hull_b ~ Etiology, data = AcousticData)
## Assumption Check
plot(hull_group, 1)
plot(hull_group, 2)
car::leveneTest(hull_group)
hull_residuals <- residuals(object = hull_group)
shapiro.test(hull_residuals)
## Model Results
summary(hull_group)
VSD 25
## Specify the Model
vsd25_group <- aov(Hull_bVSD_25 ~ Etiology, data = AcousticData)
## Assumption Check
plot(vsd25_group, 1)
plot(vsd25_group, 2)
car::leveneTest(vsd25_group)
vsd25_residuals <- residuals(object = vsd25_group)
shapiro.test(vsd25_residuals)
## Model Summary
summary(vsd25_group)
VSD 50
## Specify the Model
vsd50_group <- aov(Hull_bVSD_50 ~ Etiology, data = AcousticData)
## Assumption Check
plot(vsd50_group, 1)
plot(vsd50_group, 2)
car::leveneTest(vsd50_group)
vsd50_residuals <- residuals(object = vsd50_group)
shapiro.test(vsd50_residuals)
## Model Results
summary(vsd50_group)
## Kruskal Wallis Test
kruskal.test(Hull_bVSD_50 ~ Etiology, data = AcousticData)
VSD 75
## Specify the Model
vsd75_group <- aov(Hull_bVSD_75 ~ Etiology, data = AcousticData)
## Assumption Check
plot(vsd75_group, 1)
plot(vsd75_group, 2)
car::leveneTest(vsd75_group)
vsd75_residuals <- residuals(object = vsd75_group)
shapiro.test(vsd75_residuals)
## Model Summary
summary(vsd75_group)
## Kruskal Wallis
kruskal.test(Hull_bVSD_75 ~ Etiology, data = AcousticData)
VAS
## Specify the Model
VAS_group <- aov(VAS ~ Sex*Etiology, data = AcousticData)
## Assumption Check
plot(VAS_group, 1)
plot(VAS_group, 2)
car::leveneTest(VAS_group)
VAS_residuals <- residuals(object = VAS_group)
shapiro.test(VAS_residuals)
## Model Results
summary(VAS_group)
OT
## Specify the Model
OT_group <- aov(transAcc ~ Sex*Etiology, data = AcousticData)
## Assumption Check
plot(OT_group, 1)
plot(OT_group, 2)
car::leveneTest(OT_group)
OT_residuals <- residuals(object = OT_group)
shapiro.test(OT_residuals)
## Model Results
summary(OT_group)
Modeling Intelligibility
Orthographic Transcriptions
Model 1
# Specifying Model 1
OT_Model1 <- lm(transAcc ~ Hull_bVSD_25, data = AcousticData)
## Model 1 Assumptions
performance::check_model(OT_Model1)
## Model 1 Summary
summary(OT_Model1)
Model 2
## Specifying Model 2
OT_Model2 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75, data = AcousticData)
## Model 2 Assumption Check
performance::check_model(OT_Model2)
## Model 2 Summary
summary(OT_Model2)
## Model 1 and Model 2 Comparison
anova(OT_Model1, OT_Model2)
Model 3
## Specifying Model 3
OT_Model3 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b, data = AcousticData)
## Model 3 Assumption Check
performance::check_model(OT_Model3)
## Model 3 Summary
summary(OT_Model3)
## Model 2 and Model 3 Comparison
anova(OT_Model2, OT_Model3)
Model 4
## Specifying Model 4
OT_Model4 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b, data = AcousticData)
## Model 4 Assumption Check
performance::check_model(OT_Model4)
## Model 4 Summary
summary(OT_Model4)
## Model 3 and Model 4 Comparison
anova(OT_Model3, OT_Model4)
Model 5
## Specifying Model 5
OT_Model5 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b, data = AcousticData)
## Model 4 Assumption Check
performance::check_model(OT_Model5)
## Model 4 Summary
summary(OT_Model5)
## Model 3 and Model 4 Comparison
anova(OT_Model4, OT_Model5)
Final Model
## Specifying Final Model
OT_Model_final <- lm(transAcc ~ VSA_b, data = AcousticData)
## Final Model Assumption Check
performance::check_model(OT_Model_final)

## Final Model Summary
summary(OT_Model_final)
Call:
lm(formula = transAcc ~ VSA_b, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-46.72 -12.69 2.97 14.37 35.39
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 32.508 7.857 4.138 0.000187 ***
VSA_b 5.872 1.613 3.641 0.000807 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 20.86 on 38 degrees of freedom
Multiple R-squared: 0.2586, Adjusted R-squared: 0.2391
F-statistic: 13.25 on 1 and 38 DF, p-value: 0.0008068
VAS Models
Model 1
# Specifying Model 1
VAS_Model1 <- lm(VAS ~ Hull_bVSD_25, data = AcousticData)
## Model 1 Assumptions
performance::check_model(VAS_Model1)
## Model 1 Summary
summary(VAS_Model1)
Model 2
## Specifying Model 2
VAS_Model2 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75, data = AcousticData)
## Model 2 Assumption Check
performance::check_model(VAS_Model2)
## Model 2 Summary
summary(VAS_Model2)
## Model 1 and Model 2 Comparison
anova(VAS_Model1, VAS_Model2)
Model 3
## Specifying Model 3
VAS_Model3 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b, data = AcousticData)
## Model 3 Assumption Check
performance::check_model(VAS_Model3)
## Model 3 Summary
summary(VAS_Model3)
## Model 2 and Model 3 Comparison
anova(VAS_Model2, VAS_Model3)
Model 4
## Specifying Model 4
VAS_Model4 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b, data = AcousticData)
## Model 4 Assumption Check
performance::check_model(VAS_Model4)
## Model 4 Summary
summary(VAS_Model4)
## Model 3 and Model 4 Comparison
anova(VAS_Model3, VAS_Model4)
Model 5
## Specifying Model 5
VAS_Model5 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b, data = AcousticData)
## Model 5 Assumption Check
performance::check_model(VAS_Model5)
## Model 5 Summary
summary(VAS_Model5)
## Model 4 and Model 5 Comparison
anova(VAS_Model4, VAS_Model5)
Final Model
## Specifying Final Model
VAS_Model_final <- lm(VAS ~ VSA_b, data = AcousticData)
## Final Model Assumption Check
performance::check_model(VAS_Model_final)

## Final Model Summary
summary(VAS_Model_final)
Call:
lm(formula = VAS ~ VSA_b, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-44.956 -15.943 6.754 17.153 43.062
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 24.703 8.761 2.820 0.00760 **
VSA_b 6.163 1.798 3.427 0.00148 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 23.26 on 38 degrees of freedom
Multiple R-squared: 0.2361, Adjusted R-squared: 0.216
F-statistic: 11.74 on 1 and 38 DF, p-value: 0.001482
Relationship between OT and VAS
Tested Model
# Specify Model
OT_VAS_model <- lm(transAcc ~ VAS*Etiology + VAS*Sex, data = AcousticData)
# Assumption Check
performance::check_model(OT_VAS_model)

# Model Results
summary(OT_VAS_model)
Call:
lm(formula = transAcc ~ VAS * Etiology + VAS * Sex, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-14.910 -4.525 -1.280 5.529 16.932
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 10.8993562 5.7092981 1.909 0.0659 .
VAS 0.8924319 0.1276625 6.991 9.1e-08 ***
EtiologyAtaxic 2.9854239 9.5149402 0.314 0.7559
EtiologyHD 2.1009983 7.3948950 0.284 0.7783
EtiologyPD -2.4903757 10.1590855 -0.245 0.8080
SexM 6.8939642 7.0796700 0.974 0.3380
VAS:EtiologyAtaxic -0.0019088 0.1791048 -0.011 0.9916
VAS:EtiologyHD 0.0007804 0.1453318 0.005 0.9958
VAS:EtiologyPD 0.0320470 0.1732105 0.185 0.8545
VAS:SexM -0.1220661 0.1241230 -0.983 0.3333
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 8.488 on 30 degrees of freedom
Multiple R-squared: 0.9031, Adjusted R-squared: 0.874
F-statistic: 31.06 on 9 and 30 DF, p-value: 8.181e-13
Final Model
# Specify Final Model
OT_VAS_final <- lm(transAcc ~ VAS, data = AcousticData)
# Model Results
summary(OT_VAS_final)
Manuscript Tables
Descriptives Table
gtData %>%
gt::gt(
rowname_col = "Measure",
groupname_col = "Sex",
) %>%
fmt_number(
columns = 'All Etiologies_M':PD_sd,
decimals = 2
) %>%
tab_spanner(
label = "All Etiologies",
columns = c('All Etiologies_M', 'All Etiologies_sd')
) %>%
tab_spanner(
label = "ALS",
columns = c(ALS_M, ALS_sd)
) %>%
tab_spanner(
label = "PD",
columns = c(PD_M, PD_sd)
) %>%
tab_spanner(
label = "HD",
columns = c(HD_M, HD_sd)
) %>%
tab_spanner(
label = "Ataxic",
columns = c(Ataxic_M, Ataxic_sd)
) %>%
cols_label(
'All Etiologies_M' = "M",
'All Etiologies_sd' = "SD",
ALS_M = "M",
ALS_sd = "SD",
PD_M = "M",
PD_sd = "SD",
HD_M = "M",
HD_sd = "SD",
Ataxic_M = "M",
Ataxic_sd = "SD"
) %>%
gtsave("DescriptivesTable.html", path = "/Tables")
Error in normalizePath(dirname(file), mustWork = TRUE) :
path[1]="/Tables": No such file or directory
sjPlot::tab_model(OT_Model_final, VAS_Model_final,
show.se = T,
string.se = "SE",
file = "Tables/Model Table.html")
Alternate Analysis
In this alternate analysis, we are looking at the relationship between these acoustic measures with speech intelligibility for the ALS/PD and the HD/Ataxic speakers separately. We create a new variable called Incoord, where the ALS/PD Speakers are set as the reference group (in order to compare to the Ataxic/HD Speaker Group). Group Comparisons, additional data visualizations, and further linear model comparisons are completed.
Data Prep
# Creating a new variable in AcousticData. Incoord is a dummy variable. ALS/PD Speakers = 0, HD/Ataxic = 1
AcousticData <- AcousticData %>%
dplyr::mutate(Incoord = case_when(Etiology == "HD" ~ 1,
Etiology == "Ataxic" ~ 1,
TRUE ~ 0)) %>%
dplyr::mutate(Incoord = as.factor(Incoord))
Descriptives
Descriptives_ALS.PD_incoord <- AcousticData %>%
dplyr::group_by(Incoord) %>%
dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))
Descriptives_ALS.PD_incoord
NA
Data Vis
Group Comparison Ridgeline Plots
# VSA Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)
VSA_incoord.plot <- AcousticData %>%
ggplot() +
aes(x = VSA_b,
y = Incoord,
color = Incoord,
fill = Incoord) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Vowel Space Area (Bark)") +
theme_classic()
# Corner Dispersion Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)
disp_incoord.plot <- AcousticData %>%
ggplot() +
aes(x = vowel_ED_b,
y = Incoord,
color = Incoord,
fill = Incoord) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Corner Dispersion (Bark)") +
theme_classic()
# Hull Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)
hull_incoord.plot <- AcousticData %>%
ggplot() +
aes(x = Hull_b,
y = Incoord,
color = Incoord,
fill = Incoord) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Vowel Space Hull (Bark)") +
theme_classic()
# VSD 25 Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)
vsd25_incoord.plot <- AcousticData %>%
ggplot() +
aes(x = Hull_bVSD_25,
y = Incoord,
color = Incoord,
fill = Incoord) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Vowel Space Desnity 25 (Bark)") +
theme_classic()
# VSD 50 Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)
vsd50_incoord.plot <- AcousticData %>%
ggplot() +
aes(x = Hull_bVSD_50,
y = Incoord,
color = Incoord,
fill = Incoord) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Vowel Space Desnity 50 (Bark)") +
theme_classic()
# VSD 75 Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)
vsd75_incoord.plot <- AcousticData %>%
ggplot() +
aes(x = Hull_bVSD_75,
y = Incoord,
color = Incoord,
fill = Incoord) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Vowel Space Desnity 75 (Bark)") +
theme_classic()
# Orthographic Transcription Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)
OT_incoord.plot <- AcousticData %>%
ggplot() +
aes(x = transAcc,
y = Incoord,
color = Incoord,
fill = Incoord) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Percent Words Correct") +
theme_classic()
# Visual Analog Scale Intelligibility Rating Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)
VAS_incoord.plot <- AcousticData %>%
ggplot() +
aes(x = VAS,
y = Incoord,
color = Incoord,
fill = Incoord) +
geom_density_ridges(jittered_points = T,
position = position_points_jitter(width = 0.01, height = 0),
point_shape = '|',
point_size = 5,
point_alpha = 1,
alpha = 0.7,
scale = .7) +
xlab("Ratigns") +
theme_classic()
# Creating Distributions by Incoord Figure
Distributions_incoord <- ggpubr::ggarrange(VSA_incoord.plot, disp_incoord.plot, hull_incoord.plot, vsd25_incoord.plot, vsd50_incoord.plot, vsd75_incoord.plot, OT_incoord.plot, VAS_incoord.plot,
ncol = 2,
nrow = 4)
Picking joint bandwidth of 0.637
Picking joint bandwidth of 0.144
Picking joint bandwidth of 3.74
Picking joint bandwidth of 3.27
Picking joint bandwidth of 1.93
Picking joint bandwidth of 0.764
Picking joint bandwidth of 10.1
Picking joint bandwidth of 13
# Saving Distribution Figure
ggsave("Plots/Distribution_incoord.png", plot = last_plot(), width = 10, height = 10, unit = "in")
Scatterplots

Group Comparisons
Two Dataframes for Incoord Groups
coord.group <- AcousticData %>%
dplyr::filter(Incoord == 0)
incoord.group <- AcousticData %>%
dplyr::filter(Incoord == 1)
VSA
# Assumption Check
## Checking Normality
with(AcousticData, shapiro.test(VSA_b[Incoord == 0]))
with(AcousticData, shapiro.test(VSA_b[Incoord == 1]))
## Equal Variance Check
res.ftest.VSA <- var.test(VSA_b ~ Incoord, data = AcousticData)
res.ftest.VSA
# Model Results
VSA_b_t <- t.test(incoord.group$VSA_b, coord.group$VSA_b, var.equal = T)
VSA_b_t
Corner Dispersion
# Assumption Check
## Checking Normality
with(AcousticData, shapiro.test(vowel_ED_b[Incoord == 0]))
with(AcousticData, shapiro.test(vowel_ED_b[Incoord == 1]))
## Equal Variance Check
res.ftest.disp <- var.test(vowel_ED_b ~ Incoord, data = AcousticData)
res.ftest.disp
# Model Results
disp_t <- t.test(incoord.group$vowel_ED_b, coord.group$vowel_ED_b, var.equal = T)
disp_t
Hull
# Assumption Check
## Checking Normality
with(AcousticData, shapiro.test(Hull_b[Incoord == 0]))
with(AcousticData, shapiro.test(Hull_b[Incoord == 1]))
## Equal Variance Check
res.ftest.hull <- var.test(Hull_b ~ Incoord, data = AcousticData)
res.ftest.hull
# Model Results
hull_t <- t.test(incoord.group$Hull_b, coord.group$Hull_b, var.equal = T)
hull_t
VSD 25
# Assumption Check
## Checking Normality
with(AcousticData, shapiro.test(Hull_bVSD_25[Incoord == 0]))
with(AcousticData, shapiro.test(Hull_bVSD_25[Incoord == 1]))
## Equal Variance Check
res.ftest.vsd25 <- var.test(Hull_bVSD_25 ~ Incoord, data = AcousticData)
res.ftest.vsd25
# Model Results
vsd25_t <- t.test(incoord.group$Hull_bVSD_25, coord.group$Hull_bVSD_25, var.equal = T)
vsd25_t
VSD 50
# Assumption Check
## Checking Normality
with(AcousticData, shapiro.test(Hull_bVSD_50[Incoord == 0]))
with(AcousticData, shapiro.test(Hull_bVSD_50[Incoord == 1]))
## Equal Variance Check
res.ftest.vsd50 <- var.test(Hull_bVSD_50 ~ Incoord, data = AcousticData)
res.ftest.vsd50
# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)
vsd50_MW <- wilcox.test(Hull_bVSD_50 ~ Incoord, data = AcousticData)
vsd50_MW
VSD 75
# Assumption Check
## Checking Normality
with(AcousticData, shapiro.test(Hull_bVSD_75[Incoord == 0]))
with(AcousticData, shapiro.test(Hull_bVSD_75[Incoord == 1]))
## Equal Variance Check
res.ftest.vsd75 <- var.test(Hull_bVSD_75 ~ Incoord, data = AcousticData)
res.ftest.vsd75
# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)
vsd75_MW <- wilcox.test(Hull_bVSD_75 ~ Incoord, data = AcousticData)
vsd75_MW
Orthographic Transcription Scores
# Assumption Check
## Checking Normality
with(AcousticData, shapiro.test(transAcc[Incoord == 0]))
with(AcousticData, shapiro.test(transAcc[Incoord == 1]))
## Equal Variance Check
res.ftest.OT <- var.test(transAcc ~ Incoord, data = AcousticData)
res.ftest.OT
# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)
OT_MW <- wilcox.test(transAcc ~ Incoord, data = AcousticData)
OT_MW
VAS
# Assumption Check
## Checking Normality
with(AcousticData, shapiro.test(VAS[Incoord == 0]))
with(AcousticData, shapiro.test(VAS[Incoord == 1]))
## Equal Variance Check
res.ftest.VAS <- var.test(VAS ~ Incoord, data = AcousticData)
res.ftest.VAS
# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)
OT_MW <- wilcox.test(VAS ~ Incoord, data = AcousticData)
OT_MW
OT Analysis
Since we found significant group differences for some acoustic measures between the ALS/PD and Ataxic/HD groups, we continued the heirarichal regression approach from OT Model 5. Adding in the Incoord predictor along with the interactions between the acoustic measures did not significantly improve model fit. So our original final OT model is retained.
Model 6
## Specifying Model 6
OT_Model6 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + Incoord, data = AcousticData)
## Model 6 Assumption Check
performance::check_model(OT_Model6)

## Model 6 Summary
summary(OT_Model6)
Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b +
VSA_b + vowel_ED_b + Incoord, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-42.105 -11.266 4.121 13.717 31.536
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 17.5375 21.0257 0.834 0.4102
Hull_bVSD_25 -1.6809 1.1892 -1.413 0.1669
Hull_bVSD_75 0.9833 2.1390 0.460 0.6487
Hull_b 1.0629 0.7946 1.338 0.1901
VSA_b 6.5678 2.6475 2.481 0.0184 *
vowel_ED_b 4.8102 12.8358 0.375 0.7102
Incoord1 -12.8123 7.6496 -1.675 0.1034
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 21.02 on 33 degrees of freedom
Multiple R-squared: 0.346, Adjusted R-squared: 0.2271
F-statistic: 2.91 on 6 and 33 DF, p-value: 0.02173
## Model 5 and Model 6 Comparison
anova(OT_Model5, OT_Model6)
Error in anova(OT_Model5, OT_Model6) : object 'OT_Model5' not found
Model 7
## Specifying Model 7
OT_Model7 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord*Hull_bVSD_25, data = AcousticData)
## Model 7 Assumption Check
performance::check_model(OT_Model7)

## Model 7 Summary
summary(OT_Model7)
Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b +
VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-41.665 -10.983 4.212 14.044 31.363
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 19.3827 22.9018 0.846 0.4036
Hull_bVSD_25 -1.7865 1.2973 -1.377 0.1780
Hull_bVSD_75 0.8920 2.2093 0.404 0.6891
Hull_b 1.0871 0.8136 1.336 0.1909
VSA_b 6.5883 2.6881 2.451 0.0199 *
vowel_ED_b 4.3440 13.1935 0.329 0.7441
Incoord1 -16.7140 19.2373 -0.869 0.3914
Hull_bVSD_25:Incoord1 0.2417 1.0905 0.222 0.8260
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 21.33 on 32 degrees of freedom
Multiple R-squared: 0.347, Adjusted R-squared: 0.2042
F-statistic: 2.429 on 7 and 32 DF, p-value: 0.04086
## Model 6 and Model 7 Comparison
anova(OT_Model6, OT_Model7)
Analysis of Variance Table
Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord * Hull_bVSD_25
Res.Df RSS Df Sum of Sq F Pr(>F)
1 33 14583
2 32 14561 1 22.358 0.0491 0.826
Model 8
## Specifying Model 8
OT_Model8 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75, data = AcousticData)
## Model 8 Assumption Check
performance::check_model(OT_Model8)

## Model 8 Summary
summary(OT_Model8)
Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b +
VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord *
Hull_bVSD_75, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-41.858 -12.366 6.261 13.135 30.401
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 19.4909 22.7677 0.856 0.3985
Hull_bVSD_25 -1.4002 1.3310 -1.052 0.3009
Hull_bVSD_75 -0.7590 2.6079 -0.291 0.7730
Hull_b 0.9879 0.8132 1.215 0.2336
VSA_b 6.8700 2.6831 2.560 0.0155 *
vowel_ED_b 4.0042 13.1193 0.305 0.7622
Incoord1 -6.3149 21.0758 -0.300 0.7665
Hull_bVSD_25:Incoord1 -1.1508 1.6068 -0.716 0.4792
Hull_bVSD_75:Incoord1 5.4156 4.6125 1.174 0.2493
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 21.21 on 31 degrees of freedom
Multiple R-squared: 0.3748, Adjusted R-squared: 0.2135
F-statistic: 2.323 on 8 and 31 DF, p-value: 0.04412
## Model 7 and Model 8 Comparison
anova(OT_Model7, OT_Model8)
Analysis of Variance Table
Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord * Hull_bVSD_25
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75
Res.Df RSS Df Sum of Sq F Pr(>F)
1 32 14561
2 31 13941 1 619.94 1.3786 0.2493
Model 9
## Specifying Model 9
OT_Model9 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b, data = AcousticData)
## Model 9 Assumption Check
performance::check_model(OT_Model9)

## Model 9 Summary
summary(OT_Model9)
Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b +
VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord *
Hull_bVSD_75 + Incoord * Hull_b, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-43.387 -11.747 5.389 14.794 30.552
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 22.2613 23.3541 0.953 0.3481
Hull_bVSD_25 -0.8239 1.6003 -0.515 0.6104
Hull_bVSD_75 -1.1104 2.6847 -0.414 0.6821
Hull_b 0.5095 1.0933 0.466 0.6446
VSA_b 6.9293 2.7092 2.558 0.0158 *
vowel_ED_b 5.4227 13.4118 0.404 0.6888
Incoord1 -22.3892 32.2682 -0.694 0.4931
Hull_bVSD_25:Incoord1 -2.4414 2.5348 -0.963 0.3432
Hull_bVSD_75:Incoord1 6.0684 4.7580 1.275 0.2120
Hull_b:Incoord1 1.1098 1.6753 0.662 0.5128
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 21.4 on 30 degrees of freedom
Multiple R-squared: 0.3838, Adjusted R-squared: 0.199
F-statistic: 2.076 on 9 and 30 DF, p-value: 0.06468
## Model 8 and Model 9 Comparison
anova(OT_Model8, OT_Model9)
Analysis of Variance Table
Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 +
Incoord * Hull_b
Res.Df RSS Df Sum of Sq F Pr(>F)
1 31 13941
2 30 13740 1 200.96 0.4388 0.5128
Model 10
## Specifying Model 10
OT_Model10 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b, data = AcousticData)
## Model 10 Assumption Check
performance::check_model(OT_Model10)
## Model 10 Summary
summary(OT_Model10)
## Model 9 and Model 10 Comparison
anova(OT_Model9, OT_Model10)
Model 11
mo
## Specifying Model 11
OT_Model11 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b + Incoord*vowel_ED_b, data = AcousticData)
## Model 11 Assumption Check
performance::check_model(OT_Model11)

## Model 11 Summary
summary(OT_Model11)
Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b +
VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord *
Hull_bVSD_75 + Incoord * Hull_b + Incoord * VSA_b + Incoord *
vowel_ED_b, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-43.580 -9.987 5.535 12.978 34.285
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 43.2053 29.3160 1.474 0.1517
Hull_bVSD_25 -1.1058 1.6324 -0.677 0.5037
Hull_bVSD_75 -1.5475 2.7375 -0.565 0.5764
Hull_b 0.7017 1.1505 0.610 0.5469
VSA_b 10.1342 4.9387 2.052 0.0496 *
vowel_ED_b -11.6247 19.6753 -0.591 0.5594
Incoord1 -65.5861 49.3675 -1.329 0.1947
Hull_bVSD_25:Incoord1 -2.4987 2.6071 -0.958 0.3460
Hull_bVSD_75:Incoord1 7.0129 4.8830 1.436 0.1620
Hull_b:Incoord1 0.9481 1.7139 0.553 0.5845
VSA_b:Incoord1 -4.9394 5.9410 -0.831 0.4128
vowel_ED_b:Incoord1 33.2037 27.7349 1.197 0.2413
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 21.6 on 28 degrees of freedom
Multiple R-squared: 0.4141, Adjusted R-squared: 0.1839
F-statistic: 1.799 on 11 and 28 DF, p-value: 0.1025
## Model 10 and Model 11 Comparison
anova(OT_Model10, OT_Model11)
Error in anova(OT_Model10, OT_Model11) : object 'OT_Model10' not found
VAS Analysis
Since we found significant group differences for some acoustic measures between the ALS/PD and Ataxic/HD groups, we continued the hierarchical regression approach from VAS Model 5. VAS Model 6 fit significantly better than VAS Model 5. However, adding in the interactions between Incoord and the acoustic measures did not significantly improve model fit.
Model 6
## Specifying Model 6
VAS_Model6 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + Incoord, data = AcousticData)
## Model 6 Assumption Check
performance::check_model(VAS_Model6)
## Model 6 Summary
summary(VAS_Model6)
## Model 5 and Model 6 Comparison
anova(VAS_Model5, VAS_Model6)
Model 7
## Specifying Model 7
VAS_Model7 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord*Hull_bVSD_25, data = AcousticData)
## Model 7 Assumption Check
performance::check_model(VAS_Model7)
## Model 7 Summary
summary(VAS_Model7)
## Model 6 and Model 7 Comparison
anova(VAS_Model6, VAS_Model7)
Model 8
## Specifying Model 8
VAS_Model8 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75, data = AcousticData)
## Model 8 Assumption Check
performance::check_model(VAS_Model8)
## Model 8 Summary
summary(VAS_Model8)
## Model 7 and Model 8 Comparison
anova(VAS_Model7, VAS_Model8)
Model 9
## Specifying Model 9
VAS_Model9 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b, data = AcousticData)
## Model 9 Assumption Check
performance::check_model(VAS_Model9)
## Model 9 Summary
summary(VAS_Model9)
## Model 8 and Model 9 Comparison
anova(VAS_Model8, VAS_Model9)
Model 10
## Specifying Model 10
VAS_Model10 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b, data = AcousticData)
## Model 10 Assumption Check
performance::check_model(VAS_Model10)
## Model 10 Summary
summary(VAS_Model10)
## Model 9 and Model 10 Comparison
anova(VAS_Model9, VAS_Model10)
Model 11
## Specifying Model 11
VAS_Model11 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b +
Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b + Incoord*vowel_ED_b, data = AcousticData)
## Model 11 Assumption Check
performance::check_model(VAS_Model11)

## Model 11 Summary
summary(VAS_Model11)
Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b +
vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord *
Hull_bVSD_75 + Incoord * Hull_b + Incoord * VSA_b + Incoord *
vowel_ED_b, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-40.891 -10.110 1.062 12.791 41.858
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 47.5360 31.4458 1.512 0.1418
Hull_bVSD_25 -2.1672 1.7510 -1.238 0.2261
Hull_bVSD_75 -0.5799 2.9363 -0.198 0.8449
Hull_b 1.0811 1.2341 0.876 0.3885
VSA_b 13.3050 5.2975 2.512 0.0181 *
vowel_ED_b -20.8152 21.1048 -0.986 0.3324
Incoord1 -97.1376 52.9541 -1.834 0.0772 .
Hull_bVSD_25:Incoord1 -1.2486 2.7965 -0.447 0.6587
Hull_bVSD_75:Incoord1 5.3787 5.2378 1.027 0.3133
Hull_b:Incoord1 0.6902 1.8384 0.375 0.7102
VSA_b:Incoord1 -8.4322 6.3726 -1.323 0.1965
vowel_ED_b:Incoord1 49.3281 29.7498 1.658 0.1085
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 23.17 on 28 degrees of freedom
Multiple R-squared: 0.4413, Adjusted R-squared: 0.2218
F-statistic: 2.011 on 11 and 28 DF, p-value: 0.06657
## Model 10 and Model 11 Comparison
anova(VAS_Model10, VAS_Model11)
Error in anova(VAS_Model10, VAS_Model11) : object 'VAS_Model10' not found
New Final VAS Model
Since VAS Model 6 was significantly better fit than Model 5, we fit a new final parsimonious model for VAS to the data (VAS ~ VSA_b + Incoord) and compared that to the old final VAS model (VAS ~ VSA_b). The new final model was not a significantly better fit than the old final model. Thus the old final model (VAS ~ VSA_b) is retained.
## Specifying New Final VAS Model
VAS_Model_newfinal <- lm(VAS ~ VSA_b + Incoord, data = AcousticData)
## New Final VAS Model Assumption Check
performance::check_model(VAS_Model_newfinal)

## New Final VAS Model Summary
summary(VAS_Model_newfinal)
Call:
lm(formula = VAS ~ VSA_b + Incoord, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-42.770 -17.018 3.197 18.896 40.044
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 25.305 8.498 2.978 0.005097 **
VSA_b 7.680 1.925 3.990 0.000301 ***
Incoord1 -14.624 7.873 -1.858 0.071190 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 22.54 on 37 degrees of freedom
Multiple R-squared: 0.3012, Adjusted R-squared: 0.2635
F-statistic: 7.975 on 2 and 37 DF, p-value: 0.001319
## Comparison to Old Final Model
anova(VAS_Model_final, VAS_Model_newfinal)
Analysis of Variance Table
Model 1: VAS ~ VSA_b
Model 2: VAS ~ VSA_b + Incoord
Res.Df RSS Df Sum of Sq F Pr(>F)
1 38 20556
2 37 18802 1 1753.6 3.4509 0.07119 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Testing Individual Predictors
Because some correlations between predictors are high. We run a series of simple linear regressions to test if the predictors significantly predict each intelligibility measure on their own (VSD 25 and VSA models were already complete in our initial model comparison approach)
Orthographic Transcription Models
# OT ~ VSD 75
OT_vsd75_model <- lm(transAcc ~ Hull_bVSD_75, data = AcousticData)
performance::check_model(OT_vsd75_model)
summary(OT_vsd75_model)
# OT ~ Hull
OT_hull_model <- lm(transAcc ~ Hull_b, data = AcousticData)
performance::check_model(OT_hull_model)
summary(OT_hull_model)
# OT ~ Corner Dispersion
OT_disp_model <- lm(transAcc ~ vowel_ED_b, data = AcousticData)
performance::check_model(OT_disp_model)
summary(OT_disp_model)
VAS Models
# VAS ~ VSD 75
VAS_vsd75_model <- lm(VAS ~ Hull_bVSD_75, data = AcousticData)
performance::check_model(VAS_vsd75_model)
summary(VAS_vsd75_model)
# VAS ~ Hull
VAS_hull_model <- lm(VAS ~ Hull_b, data = AcousticData)
performance::check_model(VAS_hull_model)
summary(VAS_hull_model)
# VAS ~ Corner Dispersion
VAS_disp_model <- lm(VAS ~ vowel_ED_b, data = AcousticData)
performance::check_model(VAS_disp_model)
summary(VAS_disp_model)
Speaker Demographics
SpeakerDemo <- AcousticData %>%
dplyr::select(c(Speaker, Sex, Etiology))
Ages <- rio::import("Prepped Data/Speaker Ages.xlsx")
SpeakerDemo <- full_join(SpeakerDemo, Ages, by = "Speaker")
SpeakerDemoInfo <- SpeakerDemo %>%
furniture::table1(Sex, Etiology, Age, na.rm = F)
SpeakerDemoInfo
─────────────────────────────
─────────────────────────────
SpeakerDemo %>%
dplyr::summarize(mean_age = mean(Age, na.rm = T), age_sd = sd(Age, na.rm = T), age_range = range(Age, na.rm = T))
NA
LS0tCnRpdGxlOiAiVm93ZWwgQWNvdXN0aWNzIGFzIFByZWRpY3RvcnMgb2YgU3BlZWNoIEludGVsbGlnaWJpbGl0eSBpbiBEeXNhcnRocmlhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIGlzIHRoZSBjb2RlIGZvciB0aGUgc3RhdGlzdGljYWwgYW5hbHlzaXMgZm9yICJWb3dlbCBBY291c3RpY3MgYXMgUHJlZGljdG9ycyBvZiBTcGVlY2ggSW50ZWxsaWdpYmlsaXR5IGluIER5c2FydGhyaWEuIgoKIyBMb2FkaW5nIFBhY2thZ2VzCgpgYGB7cn0KCmxpYnJhcnkocmlvKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShpcnIpCmxpYnJhcnkocGVyZm9ybWFuY2UpCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShjb3JycikKbGlicmFyeShnZ3JpZGdlcykKbGlicmFyeShmdXJuaXR1cmUpCmxpYnJhcnkoZ3QpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGtzKQojIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJBbGxhbkNhbWVyb24vZ2VvbXRleHRwYXRoIikKbGlicmFyeShnZW9tdGV4dHBhdGgpCgpgYGAKCiMgVXBsb2FkIERhdGFzZXRzCgpgYGB7cn0KClJlbGlhYmlsaXR5IDwtIHJpbzo6aW1wb3J0KCJQcmVwcGVkIERhdGEvUmVsaWFiaWxpdHkgRGF0YS5jc3YiKQpBY291c3RpY0RhdGEgPC0gcmlvOjppbXBvcnQoIlByZXBwZWQgRGF0YS9BY291c3RpY01lYXN1cmVzLmNzdiIpICU+JQogIGRwbHlyOjptdXRhdGUoaW50RGlmZiA9IFZBUyAtIHRyYW5zQWNjKQoKQWNvdXN0aWNEYXRhIDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFncmVwbCgiX3JlbCIsIFNwZWFrZXIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoU3BlYWtlciwgU2V4LCBFdGlvbG9neSwgdm93ZWxfRURfYiwgVlNBX2IsIEh1bGxfYiwgSHVsbF9iVlNEXzI1LCBIdWxsX2JWU0RfNTAsIEh1bGxfYlZTRF83NSwgVkFTLCB0cmFuc0FjYykpCgpMaXN0ZW5lcnMgPC0gcmlvOjppbXBvcnQoIlByZXBwZWQgRGF0YS9MaXN0ZW5lcl9EZW1vZ3JhcGhpY3MuY3N2IikgJT4lCiAgZHBseXI6OnNlbGVjdCghYyhTdGFydERhdGU6cHJvbG9maWNJRCwgUTIuNF82X1RFWFQsIFEzLjJfOF9URVhULCBBdWRpb0NoZWNrOkVQMykpCgpMaXN0ZW5lcnMkcmFjZVtMaXN0ZW5lcnMkUTMuM183X1RFWFQgPT0gIk5hdGl2ZSBBbWVyaWNhbi8gQWZyaWNhbiBhbWVyY2luZyJdIDwtICJCaXJhY2lhbCBvciBNdWx0aXJhY2lhbCIKYGBgCgoKIyBJbnRlci1yYXRlciBSZWxpYWJpbGl0eQoKVHdvIHJhdGVycyAodGhlIGZpcnN0IHR3byBhdXRob3JzKSBjb21wbGV0ZWQgdm93ZWwgc2VnbWVudGF0aW9uIGZvciB0aGUgc3BlYWtlcnMuIFRvIGNhbGN1bGF0ZSBpbnRlci1yYXRlciByZWxpYWJpbGl0eSwgMjAlIG9mIHRoZSBzcGVha2VycyB3ZXJlIHNlZ21lbnRlZCBhZ2FpbiBieSB0aGUgb3RoZXIgcmF0ZXIuIFR3by13YXkgaW50cmFjbGFzcyBjb2VmZmljaWVudHMgd2VyZSBjb21wdXRlZCBmb3IgdGhlIGV4dHJhY3RlZCBGMSBhbmQgRjIgZnJvbSB0aGUgdGVtcG9yYWwgbWlkcG9pbnQgb2YgdGhlIHZvd2VsIHNlZ21lbnRzLiBTaW5jZSBvbmx5IG9uZSBzZXQgb2YgcmF0aW5ncyB3aWxsIGJlIHVzZWQgaW4gdGhlIGRhdGEgYW5hbHlzaXMsIHdlIGZvY3VzIG9uIHRoZSBzaW5nbGUgSUNDIHJlc3VsdHMgYW5kIGludGVycHJldGF0aW9uLiBIb3dldmVyLCB3ZSBhbHNvIHJlcG9ydCB0aGUgYXZlcmFnZSBJQ0MgdmFsdWVzIHRvIGJlIGNvbXByZWhlbnNpdmUuCgpgYGB7cn0KCiMjIENyZWF0aW5nIG5ldyBkYXRhIGZyYW1lcyB0byBjYWxjdWxhdGUgSUNDIGZvciBleHRyYWN0ZWQgRjEgYW5kIEYyIHZhbHVlcwoKRjFfUmVsIDwtIFJlbGlhYmlsaXR5ICU+JQogIGRwbHlyOjpzZWxlY3QoYyhGMSwgRjFfcmVsKSkKCkYyX1JlbCA8LSBSZWxpYWJpbGl0eSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoRjIsIEYyX3JlbCkpCiAgCiMjIFNpbmdsZSBJQ0MgZm9yIEYxClNpbmdsZV9GMSA8LSBpcnI6OmljYyhGMV9SZWwsIG1vZGVsID0gInR3b3dheSIsIHR5cGUgPSAiYWdyZWVtZW50IiwgdW5pdCA9ICJzaW5nbGUiKQoKIyMgQXZlcmFnZSBJQ0MgZm9yIEYxCkF2ZXJhZ2VfRjEgPC0gaXJyOjppY2MoRjFfUmVsLCBtb2RlbCA9ICJ0d293YXkiLCB0eXBlID0gImFncmVlbWVudCIsIHVuaXQgPSAiYXZlcmFnZSIpCgojIyBTaW5nbGUgSUNDIGZvciBGMgpTaW5nbGVfRjIgPC0gaXJyOjppY2MoRjJfUmVsLCBtb2RlbCA9ICJ0d293YXkiLCB0eXBlID0gImFncmVlbWVudCIsIHVuaXQgPSAic2luZ2xlIikKCiMjIEF2ZXJhZ2UgSUNDIGZvciBGMgpBdmVyYWdlX0YyIDwtIGlycjo6aWNjKEYyX1JlbCwgbW9kZWwgPSAidHdvd2F5IiwgdHlwZSA9ICJhZ3JlZW1lbnQiLCB1bml0ID0gImF2ZXJhZ2UiKQoKIyMgSW50ZXItcmF0ZXIgcmVsaWFiaWxpdHkgcmVzdWx0cyBhbmQgaW50ZXJwcmV0YXRpb24KCnByaW50KHBhc3RlKCJTaW5nbGUgSUNDIGZvciBGMSBpcyAiLCByb3VuZChTaW5nbGVfRjEkdmFsdWUsIGRpZ2l0cyA9IDMpLCAiLiAiLCAKICAgICAgICAgICAgIlRoZSA5NSUgQ0kgaXMgWyIsIHJvdW5kKFNpbmdsZV9GMSRsYm91bmQsIGRpZ2l0cyA9IDMpLCAiIC0gIiwgcm91bmQoU2luZ2xlX0YxJHVib3VuZCwgZGlnaXRzID0gMyksICJdLiIsIHNlcCA9ICIiKSkKCnByaW50KHBhc3RlKCJTaW5nbGUgSUNDIGZvciBGMiBpcyAiLCByb3VuZChTaW5nbGVfRjIkdmFsdWUsIGRpZ2l0cyA9IDMpLCAiLiAiLCAKICAgICAgICAgICAgIlRoZSA5NSUgQ0kgaXMgWyIsIHJvdW5kKFNpbmdsZV9GMiRsYm91bmQsIGRpZ2l0cyA9IDMpLCAiIC0gIiwgcm91bmQoU2luZ2xlX0YyJHVib3VuZCwgZGlnaXRzID0gMyksICJdLiIsIHNlcCA9ICIiKSkKCnByaW50KHBhc3RlKCJBdmVyYWdlIElDQyBmb3IgRjEgaXMgIiwgcm91bmQoQXZlcmFnZV9GMSR2YWx1ZSwgZGlnaXRzID0gMyksICIuICIsIAogICAgICAgICAgICAiVGhlIDk1JSBDSSBpcyBbIiwgcm91bmQoQXZlcmFnZV9GMSRsYm91bmQsIGRpZ2l0cyA9IDMpLCAiIC0gIiwgcm91bmQoQXZlcmFnZV9GMSR1Ym91bmQsIGRpZ2l0cyA9IDMpLCAiXS4iLCBzZXAgPSAiIikpCgpwcmludChwYXN0ZSgiQXZlcmFnZSBJQ0MgZm9yIEYyIGlzICIsIHJvdW5kKEF2ZXJhZ2VfRjIkdmFsdWUsIGRpZ2l0cyA9IDMpLCAiLiAiLCAKICAgICAgICAgICAgIlRoZSA5NSUgQ0kgaXMgWyIsIHJvdW5kKEF2ZXJhZ2VfRjIkbGJvdW5kLCBkaWdpdHMgPSAzKSwgIiAtICIsIHJvdW5kKEF2ZXJhZ2VfRjIkdWJvdW5kLCBkaWdpdHMgPSAzKSwgIl0uIiwgc2VwID0gIiIpKQoKcHJpbnQoIlRodXMsIGludGVycmF0ZXIgcmVsaWFiaWxpdHkgZm9yIHRoZSBleHRyYWN0ZWQgRjEgYW5kIEYyIHZhbHVlcyBmcm9tIHRoZSB2b3dlbCBzZWdtZW50cyB3YXMgZ29vZCB0byBleGNlbGxlbnQuIikKCiMjIFJlbW92aW5nIGV4dHJhIGRhdGEgZnJhbWVzIGZyb20gZW52aXJvbm1lbnQKCnJtKEYxX1JlbCwgRjJfUmVsLCBSZWxpYWJpbGl0eSwgU2luZ2xlX0YxLCBTaW5nbGVfRjIsIEF2ZXJhZ2VfRjEsIEF2ZXJhZ2VfRjIpCgpgYGAKCgojIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MKCiMjIE1lYW5zIGFuZCBTRAoKYGBge3J9CgpEZXNjcmlwdGl2ZXMgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpncm91cF9ieShTZXgsIEV0aW9sb2d5KSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKFZTQV9tZWFuID0gbWVhbihWU0FfYiwgbmEucm0gPVQpLCBWU0Ffc2QgPSBzZChWU0FfYiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgIERpc3BfbWVhbiA9IG1lYW4odm93ZWxfRURfYiwgbmEucm0gPVQpLCBEaXNwX3NkID0gc2Qodm93ZWxfRURfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgSHVsbF9tZWFuID0gbWVhbihIdWxsX2IsIG5hLnJtID1UKSwgSHVsbF9zZCA9IHNkKEh1bGxfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNEMjVfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksIFZTRDI1X3NkID0gc2QoSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q1MF9tZWFuID0gbWVhbihIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwgVlNENTBfc2QgPSBzZChIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDc1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLCBWU0Q3NV9zZCA9IHNkKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVkFTX21lYW4gPSBtZWFuKFZBUywgbmEucm0gPVQpLCBWQVNfc2QgPSBzZChWQVMsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIE9UX21lYW4gPSBtZWFuKHRyYW5zQWNjLCBuYS5ybSA9VCksIE9UX3NkID0gc2QodHJhbnNBY2MsIG5hLnJtID1UKSkKCkRlc2NyaXB0aXZlc2J5U2V4IDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoU2V4KSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKFZTQV9tZWFuID0gbWVhbihWU0FfYiwgbmEucm0gPVQpLCBWU0Ffc2QgPSBzZChWU0FfYiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgIERpc3BfbWVhbiA9IG1lYW4odm93ZWxfRURfYiwgbmEucm0gPVQpLCBEaXNwX3NkID0gc2Qodm93ZWxfRURfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgSHVsbF9tZWFuID0gbWVhbihIdWxsX2IsIG5hLnJtID1UKSwgSHVsbF9zZCA9IHNkKEh1bGxfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNEMjVfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksIFZTRDI1X3NkID0gc2QoSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q1MF9tZWFuID0gbWVhbihIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwgVlNENTBfc2QgPSBzZChIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDc1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLCBWU0Q3NV9zZCA9IHNkKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVkFTX21lYW4gPSBtZWFuKFZBUywgbmEucm0gPVQpLCBWQVNfc2QgPSBzZChWQVMsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIE9UX21lYW4gPSBtZWFuKHRyYW5zQWNjLCBuYS5ybSA9VCksIE9UX3NkID0gc2QodHJhbnNBY2MsIG5hLnJtID1UKSkKCkRlc2NyaXB0aXZlc2J5RXRpb2xvZ3kgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpncm91cF9ieShFdGlvbG9neSkgJT4lCiAgZHBseXI6OnN1bW1hcml6ZShWU0FfbWVhbiA9IG1lYW4oVlNBX2IsIG5hLnJtID1UKSwgVlNBX3NkID0gc2QoVlNBX2IsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICBEaXNwX21lYW4gPSBtZWFuKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwgRGlzcF9zZCA9IHNkKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIEh1bGxfbWVhbiA9IG1lYW4oSHVsbF9iLCBuYS5ybSA9VCksIEh1bGxfc2QgPSBzZChIdWxsX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDI1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLCBWU0QyNV9zZCA9IHNkKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNENTBfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksIFZTRDUwX3NkID0gc2QoSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q3NV9tZWFuID0gbWVhbihIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwgVlNENzVfc2QgPSBzZChIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZBU19tZWFuID0gbWVhbihWQVMsIG5hLnJtID1UKSwgVkFTX3NkID0gc2QoVkFTLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBPVF9tZWFuID0gbWVhbih0cmFuc0FjYywgbmEucm0gPVQpLCBPVF9zZCA9IHNkKHRyYW5zQWNjLCBuYS5ybSA9VCkpCgpEZXNjcmlwdGl2ZXMKCkRlc2NyaXB0aXZlc2J5U2V4CgpEZXNjcmlwdGl2ZXNieUV0aW9sb2d5CgpgYGAKCiMjIENvcnJlbGF0aW9ucyBhbW9uZyB2YXJpYWJsZXMKCmBgYHtyfQoKQ29yck1hdHJpeDEgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpzZWxlY3QoVlNBX2IsIHZvd2VsX0VEX2IsIEh1bGxfYiwgSHVsbF9iVlNEXzI1LCBIdWxsX2JWU0RfNTAsIEh1bGxfYlZTRF83NSwgVkFTLCB0cmFuc0FjYykgJT4lCiAgY29ycnI6OmNvcnJlbGF0ZSgpCgpDb3JyTWF0cml4MQoKYGBgCgoKIyMgRGF0YSBWaXMKCiMjIyBHcm91cCBDb21wYXJpc29uczogUmlkZ2VsaW5lIFBsb3RzCgpgYGB7cn0KCiMgVm93ZWwgU3BhY2UgQXJlYSBEaXN0cmlidXRpb24gYnkgRXRpb2xvZ3kKClZTQV9wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBWU0FfYiwKICAgICAgeSA9IEV0aW9sb2d5LAogICAgICBjb2xvciA9IEV0aW9sb2d5LAogICAgICBmaWxsID0gRXRpb2xvZ3kpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBBcmVhIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMjIENvcm5lciBEaXNwZXJzaW9uIERpc3RyaWJ1dGlvbiBieSBFdGlvbG9neQoKZGlzcF9wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gRXRpb2xvZ3ksCiAgICAgIGNvbG9yID0gRXRpb2xvZ3ksCiAgICAgIGZpbGwgPSBFdGlvbG9neSkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIkNvcm5lciBEaXNwZXJzaW9uIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVm93ZWwgU3BhY2UgSHVsbCBEaXN0cmlidXRpb24gYnkgRXRpb2xvZ3kKCkh1bGxfcGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gRXRpb2xvZ3ksCiAgICAgIGNvbG9yID0gRXRpb2xvZ3ksCiAgICAgIGZpbGwgPSBFdGlvbG9neSkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBWb3dlbCBTcGFjZSBEZW5zaXR5IDI1IERpc3RyaWJ1dGlvbiBieSBFdGlvbG9neQoKdnNkXzI1X3Bsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYlZTRF8yNSwKICAgICAgeSA9IEV0aW9sb2d5LAogICAgICBjb2xvciA9IEV0aW9sb2d5LAogICAgICBmaWxsID0gRXRpb2xvZ3kpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBEZW5pc3R5IDI1IChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVm93ZWwgU3BhY2UgRGVuc2l0eSA1MCBEaXN0cmlidXRpb24gYnkgRXRpb2xvZ3kKCnZzZF81MF9wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfNTAsCiAgICAgIHkgPSBFdGlvbG9neSwKICAgICAgY29sb3IgPSBFdGlvbG9neSwKICAgICAgZmlsbCA9IEV0aW9sb2d5KSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVuaXN0eSA1MCAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIFZvd2VsIFNwYWNlIERlbnNpdHkgNzUgRGlzdHJpYnV0aW9uIGJ5IEV0aW9sb2d5Cgp2c2RfNzVfcGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gRXRpb2xvZ3ksCiAgICAgIGNvbG9yID0gRXRpb2xvZ3ksCiAgICAgIGZpbGwgPSBFdGlvbG9neSkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIGV4cGFuZF9saW1pdHMoeD0wKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVuaXN0eSA3NSAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIFZpc3VhbCBBbmFsb2cgU2NhbGUgSW50ZWxsaWdpYmlsaXR5IFJhdGluZyBEaXN0cmlidXRpb24gYnkgRXRpb2xvZ3kKClZBU19wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBWQVMsCiAgICAgIHkgPSBFdGlvbG9neSwKICAgICAgY29sb3IgPSBFdGlvbG9neSwKICAgICAgZmlsbCA9IEV0aW9sb2d5KSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVmlzdWFsIEFuYWxvZyBTY2FsZSAoVkFTKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgT3J0aG9ncmFwaGljIFRyYW5zY3JpcHRpb24gU2NvcmUgRGlzdHJpYnV0aW9uIGJ5IEV0aW9sb2d5CgpPVF9wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB0cmFuc0FjYywKICAgICAgeSA9IEV0aW9sb2d5LAogICAgICBjb2xvciA9IEV0aW9sb2d5LAogICAgICBmaWxsID0gRXRpb2xvZ3kpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMTAwKSkgKwogIHhsYWIoIk9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIFNjb3JlcyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgQ3JlYXRpbmcgRGlzdHJpYnV0aW9ucyBGaWd1cmUKCkRpc3RyaWJ1dGlvbnMgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoVlNBX3Bsb3QsIGRpc3BfcGxvdCwgSHVsbF9wbG90LCB2c2RfMjVfcGxvdCwgdnNkXzUwX3Bsb3QsIHZzZF83NV9wbG90LCBWQVNfcGxvdCwgT1RfcGxvdCwKICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICAgICAgICAgIG5yb3cgPSA0KQoKIyBTYXZpbmcgRGlzdHJpYnV0aW9uIEZpZ3VyZQoKZ2dzYXZlKCJQbG90cy9EaXN0cmlidXRpb24ucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCwgdW5pdCA9ICJpbiIpCgoKYGBgCgojIyMgU2NhdHRlciBQbG90cwoKYGBge3J9CgojIE9UIFNjYXR0ZXJwbG90cwoKT1RfVlNBIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBWU0FfYiwKICAgICAgeSA9IHRyYW5zQWNjKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGNvbG9yID0gIiNFNjlGMDAiLCBmaWxsID0gImxpZ2h0IGdyZXkiKSArCiAgeGxhYihleHByZXNzaW9uKCJWb3dlbCBTcGFjZSBBcmVhIChCYXJrIl4yKiIpIikpICsKICB5bGFiKCJQZXJjZW50IFdvcmRzIENvcnJlY3QiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXNwZWN0LnJhdGlvPTEpCgpPVF9kaXNwIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gdHJhbnNBY2MpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgY29sb3IgPSAiIzU2QjRFOSIsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKCJDb3JuZXIgRGlzcGVyc2lvbiAoQmFyaykiKSArCiAgeWxhYigiUGVyY2VudCBXb3JkcyBDb3JyZWN0IikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbz0xKQoKT1RfSHVsbCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gdHJhbnNBY2MpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgY29sb3IgPSAiIzAwOUU3MyIsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKGV4cHJlc3Npb24oIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmsiXjIqIikiKSkgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkKCk9UX3ZzZDI1IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSB0cmFuc0FjYykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjMDA3MkIyIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgRGVuc2l0eSJbMjVdKiIgKEJhcmsiXjIqIikiKSkgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkKCk9UX3ZzZDc1IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfNzUsCiAgICAgIHkgPSB0cmFuc0FjYykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjRDU1RTAwIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgRGVuc2l0eSJbNzVdKiIgKEJhcmsiXjIqIikiKSkgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkKCiMgQ3JlYXRpbmcgT1QgU2NhdHRlcnBsb3QgRmlndXJlCgpPVF9TY2F0dGVycGxvdHMgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoT1RfVlNBLCBPVF9kaXNwLCBOVUxMLCBPVF9IdWxsLCBPVF92c2QyNSwgT1RfdnNkNzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMywgbnJvdyA9IDIpCgojIyBTYXZpbmcgT1QgU2NhdHRlcnBsb3QgRmlndXJlCmRpci5jcmVhdGUoIlBsb3RzIiwgc2hvd1dhcm5pbmdzID0gRikKZ2dzYXZlKCJQbG90cy9PVF9TY2F0dGVycGxvdHMucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAxNSwgdW5pdCA9ICJpbiIsIHNjYWxlID0gMC42KQoKIyBWQVMgU2NhdHRlcnBsb3RzCgpWQVNfVlNBIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBWU0FfYiwKICAgICAgeSA9IFZBUykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjRTY5RjAwIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyayJeMioiKSIpKSArCiAgeWxhYigiVkFTIFJhdGluZyIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSkKClZBU19kaXNwIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gVkFTKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGNvbG9yID0gIiM1NkI0RTkiLCBmaWxsID0gImxpZ2h0IGdyZXkiKSArCiAgeGxhYigiQ29ybmVyIERpc3BlcnNpb24gKEJhcmspIikgKwogIHlsYWIoIlZBUyBSYXRpbmciKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKVkFTX0h1bGwgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYiwKICAgICAgeSA9IFZBUykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjMDA5RTczIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgSHVsbCAoQmFyayJeMioiKSIpKSArCiAgeWxhYigiVkFTIFJhdGluZyIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpWQVNfdnNkMjUgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYlZTRF8yNSwKICAgICAgeSA9IFZBUykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjMDA3MkIyIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgRGVuc2l0eSJbMjVdKiIgKEJhcmsiXjIqIikiKSkgKwogIHlsYWIoIlZBUyBSYXRpbmciKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKVkFTX3ZzZDc1IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfNzUsCiAgICAgIHkgPSBWQVMpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgY29sb3IgPSAiI0Q1NUUwMCIsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKGV4cHJlc3Npb24oIlZvd2VsIFNwYWNlIERlbnNpdHkiWzc1XSoiIChCYXJrIl4yKiIpIikpICsKICB5bGFiKCJWQVMgUmF0aW5nIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgQ3JlYXRpbmcgVkFTIFNjYXR0ZXJwbG90IEZpZ3VyZQoKVkFTX1NjYXR0ZXJwbG90cyA8LSBnZ3B1YnI6OmdnYXJyYW5nZShWQVNfVlNBLCBWQVNfZGlzcCwgVkFTX0h1bGwsIFZBU192c2QyNSwgVkFTX3ZzZDc1LAogICAgICAgICAgICAgICAgICBuY29sID0gMywgbnJvdyA9IDIpCgojIyBTYXZpbmcgVkFTIFNjYXR0ZXJwbG90IEZpZ3VyZQoKZ2dzYXZlKCJQbG90cy9WQVNfU2NhdHRlcnBsb3RzLnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgd2lkdGggPSAxNSwgaGVpZ2h0ID0gMTUsIHVuaXQgPSAiaW4iLCBzY2FsZSA9IC42KQoKYGBgCgoKIyMjIE9UIH4gVkFTIFBsb3QKCmBgYHtyfQoKIyBWQVMgfiBPVCBQbG90CgpWQVNfT1QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZBUywKICAgICAgeSA9IHRyYW5zQWNjKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGNvbG9yID0gIiNDQzc5QTciLCBmaWxsID0gImxpZ2h0IGdyZXkiKSArIAogIGdndGl0bGUoIlJlbGF0aW9uc2hpcCBCZXR3ZWVuIEludGVsbGlnaWJpbGl0eSBNZWFzdXJlcyIpICsKICB4bGFiKCJWQVMgUmF0aW5nIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpKQoKIyBTYXZpbmcgT1QgfiBWQVMgUGxvdAoKZ2dzYXZlKCJQbG90cy9PVHZhcy5wbmciLCBwbG90ID0gbGFzdF9wbG90KCksIHdpZHRoID0gOCwgaGVpZ2h0ID0gOCwgdW5pdCA9ICJpbiIsIHNjYWxlID0gMC42KQogIAojIE9UIH4gVkFTIGJ5IFNleAoKVkFTX09UX1NleCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVkFTLAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gU2V4KSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYpICsKICB4bGFiKCJWQVMgUmF0aW5nIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdnc2F2ZSgiUGxvdHMvT1R2YXNfc2V4LnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgd2lkdGggPSA1LCBoZWlnaHQgPSA1LCB1bml0ID0gImluIiwgc2NhbGUgPSAwLjYpCgojIE9UIH4gVkFTIGJ5IEV0aW9sb2d5CgpWQVNfT1RfRXRpb2xvZ3kgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZBUywKICAgICAgeSA9IHRyYW5zQWNjLAogICAgICBjb2xvciA9IEV0aW9sb2d5KSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYpICsKICB4bGFiKCJWQVMgUmF0aW5nIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdnc2F2ZSgiUGxvdHMvT1R2YXNfZXRpb2xvZ3kucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUsIHVuaXQgPSAiaW4iLCBzY2FsZSA9IDAuNikKCmBgYAoKCiMgR3JvdXAgQ29tcGFyaXNvbnMKCiMjIFZTQQoKYGBge3J9CgojIyBTcGVjaWZ5IHRoZSBNb2RlbApWU0FfZ3JvdXAgPC0gYW92KFZTQV9iIH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KFZTQV9ncm91cCwgMSkKcGxvdChWU0FfZ3JvdXAsIDIpCmNhcjo6bGV2ZW5lVGVzdChWU0FfZ3JvdXApClZTQV9yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IFZTQV9ncm91cCkKc2hhcGlyby50ZXN0KFZTQV9yZXNpZHVhbHMpCgojIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KFZTQV9ncm91cCkKCiMjIEtydXNrYWwtV2FsbGlzIFRlc3QgCgprcnVza2FsLnRlc3QoVlNBX2IgfiBFdGlvbG9neSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIFBhaXJ3aXNlIENvbXBhcmlzb25zCgpwYWlyd2lzZS53aWxjb3gudGVzdChBY291c3RpY0RhdGEkVlNBX2IsIEFjb3VzdGljRGF0YSRFdGlvbG9neSwgcC5hZGp1c3QubWV0aG9kID0gImJvbmZlcnJvbmkiKQoKYGBgCgojIyBDb3JuZXIgRGlzcGVyc2lvbgoKYGBge3J9CgojIyBTcGVjaWZ5IHRoZSBNb2RlbApkaXNwX2dyb3VwIDwtIGFvdih2b3dlbF9FRF9iIH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KGRpc3BfZ3JvdXAsIDEpCnBsb3QoZGlzcF9ncm91cCwgMikKY2FyOjpsZXZlbmVUZXN0KGRpc3BfZ3JvdXApCmRpc3BfcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhvYmplY3QgPSBkaXNwX2dyb3VwKQpzaGFwaXJvLnRlc3QoZGlzcF9yZXNpZHVhbHMpCgojIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KGRpc3BfZ3JvdXApCgpgYGAKCiMjIEh1bGwKCmBgYHtyfQoKIyMgU3BlY2lmeSB0aGUgTW9kZWwKaHVsbF9ncm91cCA8LSBhb3YoSHVsbF9iIH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KGh1bGxfZ3JvdXAsIDEpCnBsb3QoaHVsbF9ncm91cCwgMikKY2FyOjpsZXZlbmVUZXN0KGh1bGxfZ3JvdXApCmh1bGxfcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhvYmplY3QgPSBodWxsX2dyb3VwKQpzaGFwaXJvLnRlc3QoaHVsbF9yZXNpZHVhbHMpCgojIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KGh1bGxfZ3JvdXApCgpgYGAKCiMjIFZTRCAyNQoKYGBge3J9CgojIyBTcGVjaWZ5IHRoZSBNb2RlbAp2c2QyNV9ncm91cCA8LSBhb3YoSHVsbF9iVlNEXzI1IH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KHZzZDI1X2dyb3VwLCAxKQpwbG90KHZzZDI1X2dyb3VwLCAyKQpjYXI6OmxldmVuZVRlc3QodnNkMjVfZ3JvdXApCnZzZDI1X3Jlc2lkdWFscyA8LSByZXNpZHVhbHMob2JqZWN0ID0gdnNkMjVfZ3JvdXApCnNoYXBpcm8udGVzdCh2c2QyNV9yZXNpZHVhbHMpCgojIyBNb2RlbCBTdW1tYXJ5CgpzdW1tYXJ5KHZzZDI1X2dyb3VwKQoKCmBgYAoKCiMjIFZTRCA1MAoKYGBge3J9CgojIyBTcGVjaWZ5IHRoZSBNb2RlbAp2c2Q1MF9ncm91cCA8LSBhb3YoSHVsbF9iVlNEXzUwIH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KHZzZDUwX2dyb3VwLCAxKQpwbG90KHZzZDUwX2dyb3VwLCAyKQpjYXI6OmxldmVuZVRlc3QodnNkNTBfZ3JvdXApCnZzZDUwX3Jlc2lkdWFscyA8LSByZXNpZHVhbHMob2JqZWN0ID0gdnNkNTBfZ3JvdXApCnNoYXBpcm8udGVzdCh2c2Q1MF9yZXNpZHVhbHMpCgojIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KHZzZDUwX2dyb3VwKQoKIyMgS3J1c2thbCBXYWxsaXMgVGVzdAoKa3J1c2thbC50ZXN0KEh1bGxfYlZTRF81MCB+IEV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKYGBgCgojIyBWU0QgNzUKCmBgYHtyfQoKIyMgU3BlY2lmeSB0aGUgTW9kZWwKdnNkNzVfZ3JvdXAgPC0gYW92KEh1bGxfYlZTRF83NSB+IEV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgQXNzdW1wdGlvbiBDaGVjawoKcGxvdCh2c2Q3NV9ncm91cCwgMSkKcGxvdCh2c2Q3NV9ncm91cCwgMikKY2FyOjpsZXZlbmVUZXN0KHZzZDc1X2dyb3VwKQp2c2Q3NV9yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IHZzZDc1X2dyb3VwKQpzaGFwaXJvLnRlc3QodnNkNzVfcmVzaWR1YWxzKQoKIyMgTW9kZWwgU3VtbWFyeQoKc3VtbWFyeSh2c2Q3NV9ncm91cCkKCiMjIEtydXNrYWwgV2FsbGlzCgprcnVza2FsLnRlc3QoSHVsbF9iVlNEXzc1IH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgpgYGAKCiMjIFZBUyAKCmBgYHtyfQoKIyMgU3BlY2lmeSB0aGUgTW9kZWwKVkFTX2dyb3VwIDwtIGFvdihWQVMgfiBTZXgqRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KFZBU19ncm91cCwgMSkKcGxvdChWQVNfZ3JvdXAsIDIpCmNhcjo6bGV2ZW5lVGVzdChWQVNfZ3JvdXApClZBU19yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IFZBU19ncm91cCkKc2hhcGlyby50ZXN0KFZBU19yZXNpZHVhbHMpCgojIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KFZBU19ncm91cCkKCmBgYAoKIyMgT1QKCmBgYHtyfQoKIyMgU3BlY2lmeSB0aGUgTW9kZWwKT1RfZ3JvdXAgPC0gYW92KHRyYW5zQWNjIH4gU2V4KkV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgQXNzdW1wdGlvbiBDaGVjawoKcGxvdChPVF9ncm91cCwgMSkKcGxvdChPVF9ncm91cCwgMikKY2FyOjpsZXZlbmVUZXN0KE9UX2dyb3VwKQpPVF9yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IE9UX2dyb3VwKQpzaGFwaXJvLnRlc3QoT1RfcmVzaWR1YWxzKQoKIyMgTW9kZWwgUmVzdWx0cwoKc3VtbWFyeShPVF9ncm91cCkKCmBgYAoKIyBNb2RlbGluZyBJbnRlbGxpZ2liaWxpdHkKCiMjIE9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9ucwoKIyMjIE1vZGVsIDEKCmBgYHtyfQoKIyBTcGVjaWZ5aW5nIE1vZGVsIDEKCk9UX01vZGVsMSA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF8yNSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDEgQXNzdW1wdGlvbnMgCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWwxKQoKIyMgTW9kZWwgMSBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsMSkKCmBgYAoKIyMjIE1vZGVsIDIKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCAyCgpPVF9Nb2RlbDIgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAyIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9Nb2RlbDIpCgojIyBNb2RlbCAyIFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWwyKQoKIyMgTW9kZWwgMSBhbmQgTW9kZWwgMiBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDEsIE9UX01vZGVsMikKCmBgYAoKIyMjIE1vZGVsIDMKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCAzCgpPVF9Nb2RlbDMgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAzIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9Nb2RlbDMpCgojIyBNb2RlbCAzIFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWwzKQoKIyMgTW9kZWwgMiBhbmQgTW9kZWwgMyBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDIsIE9UX01vZGVsMykKCmBgYAoKIyMjIE1vZGVsIDQKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCA0CgpPVF9Nb2RlbDQgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDQgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsNCkKCiMjIE1vZGVsIDQgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDQpCgojIyBNb2RlbCAzIGFuZCBNb2RlbCA0IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsMywgT1RfTW9kZWw0KQoKYGBgCiMjIyBNb2RlbCA1CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNQoKT1RfTW9kZWw1IDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgNCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWw1KQoKIyMgTW9kZWwgNCBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsNSkKCiMjIE1vZGVsIDMgYW5kIE1vZGVsIDQgQ29tcGFyaXNvbgoKYW5vdmEoT1RfTW9kZWw0LCBPVF9Nb2RlbDUpCgpgYGAKCgojIyMgRmluYWwgTW9kZWwKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBGaW5hbCBNb2RlbAoKT1RfTW9kZWxfZmluYWwgPC0gbG0odHJhbnNBY2MgfiBWU0FfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIEZpbmFsIE1vZGVsIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9Nb2RlbF9maW5hbCkKCiMjIEZpbmFsIE1vZGVsIFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWxfZmluYWwpCgpgYGAKCgojIyBWQVMgTW9kZWxzCgojIyMgTW9kZWwgMQoKYGBge3J9CgojIFNwZWNpZnlpbmcgTW9kZWwgMQoKVkFTX01vZGVsMSA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAxIEFzc3VtcHRpb25zIAoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDEpCgojIyBNb2RlbCAxIFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsMSkKCmBgYAoKIyMjIE1vZGVsIDIKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCAyCgpWQVNfTW9kZWwyIDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDIgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDIpCgojIyBNb2RlbCAyIFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsMikKCiMjIE1vZGVsIDEgYW5kIE1vZGVsIDIgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsMSwgVkFTX01vZGVsMikKCmBgYAoKIyMjIE1vZGVsIDMKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCAzCgpWQVNfTW9kZWwzIDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDMgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDMpCgojIyBNb2RlbCAzIFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsMykKCiMjIE1vZGVsIDIgYW5kIE1vZGVsIDMgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsMiwgVkFTX01vZGVsMykKCmBgYAoKIyMjIE1vZGVsIDQKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCA0CgpWQVNfTW9kZWw0IDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgNCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsNCkKCiMjIE1vZGVsIDQgU3VtbWFyeQoKc3VtbWFyeShWQVNfTW9kZWw0KQoKIyMgTW9kZWwgMyBhbmQgTW9kZWwgNCBDb21wYXJpc29uCgphbm92YShWQVNfTW9kZWwzLCBWQVNfTW9kZWw0KQoKYGBgCgojIyMgTW9kZWwgNQoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDUKClZBU19Nb2RlbDUgPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgNSBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsNSkKCiMjIE1vZGVsIDUgU3VtbWFyeQoKc3VtbWFyeShWQVNfTW9kZWw1KQoKIyMgTW9kZWwgNCBhbmQgTW9kZWwgNSBDb21wYXJpc29uCgphbm92YShWQVNfTW9kZWw0LCBWQVNfTW9kZWw1KQoKYGBgCgoKIyMjIEZpbmFsIE1vZGVsCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgRmluYWwgTW9kZWwKClZBU19Nb2RlbF9maW5hbCA8LSBsbShWQVMgfiBWU0FfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIEZpbmFsIE1vZGVsIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWxfZmluYWwpCgojIyBGaW5hbCBNb2RlbCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbF9maW5hbCkKCmBgYAojIyBSZWxhdGlvbnNoaXAgYmV0d2VlbiBPVCBhbmQgVkFTCgojIyMgVGVzdGVkIE1vZGVsCgpgYGB7cn0KCiMgU3BlY2lmeSBNb2RlbAoKT1RfVkFTX21vZGVsIDwtIGxtKHRyYW5zQWNjIH4gVkFTKkV0aW9sb2d5ICsgVkFTKlNleCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX1ZBU19tb2RlbCkKCiMgTW9kZWwgUmVzdWx0cwoKc3VtbWFyeShPVF9WQVNfbW9kZWwpCgpgYGAKCiMjIEZpbmFsIE1vZGVsCgpgYGB7cn0KCiMgU3BlY2lmeSBGaW5hbCBNb2RlbAoKT1RfVkFTX2ZpbmFsIDwtIGxtKHRyYW5zQWNjIH4gVkFTLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KE9UX1ZBU19maW5hbCkKCmBgYAoKIyBNYW51c2NyaXB0IFRhYmxlcwpEZXNjcmlwdGl2ZXMgVGFibGUKYGBge3J9Cmd0RGF0YSA8LSBBY291c3RpY0RhdGEgJT4lCiAgcmJpbmQoLixBY291c3RpY0RhdGEgJT4lCiAgICAgICAgICBkcGx5cjo6bXV0YXRlKEV0aW9sb2d5ID0gIkFsbCBFdGlvbG9naWVzIikpICU+JQogIHJiaW5kKC4sQWNvdXN0aWNEYXRhICU+JQogICAgICAgICAgcmJpbmQoLixBY291c3RpY0RhdGEgJT4lCiAgICAgICAgICBkcGx5cjo6bXV0YXRlKEV0aW9sb2d5ID0gIkFsbCBFdGlvbG9naWVzIikpICU+JQogICAgICAgICAgZHBseXI6Om11dGF0ZShTZXggPSAiQWxsIikpICU+JQogIGRwbHlyOjptdXRhdGUoU2V4ID0gYXMuZmFjdG9yKFNleCksCiAgICAgICAgICAgICAgICBFdGlvbG9neSA9IGFzLmZhY3RvcihFdGlvbG9neSkpICU+JQogIGRwbHlyOjpncm91cF9ieShTZXgsIEV0aW9sb2d5KSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKFZTQV9tZWFuID0gbWVhbihWU0FfYiwgbmEucm0gPVQpLCBWU0Ffc2QgPSBzZChWU0FfYiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgIERpc3BfbWVhbiA9IG1lYW4odm93ZWxfRURfYiwgbmEucm0gPVQpLCBEaXNwX3NkID0gc2Qodm93ZWxfRURfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgSHVsbF9tZWFuID0gbWVhbihIdWxsX2IsIG5hLnJtID1UKSwgSHVsbF9zZCA9IHNkKEh1bGxfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNEMjVfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksIFZTRDI1X3NkID0gc2QoSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q1MF9tZWFuID0gbWVhbihIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwgVlNENTBfc2QgPSBzZChIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDc1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLCBWU0Q3NV9zZCA9IHNkKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVkFTX21lYW4gPSBtZWFuKFZBUywgbmEucm0gPVQpLCBWQVNfc2QgPSBzZChWQVMsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIE9UX21lYW4gPSBtZWFuKHRyYW5zQWNjLCBuYS5ybSA9VCksIE9UX3NkID0gc2QodHJhbnNBY2MsIG5hLnJtID1UKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBWU0FfbWVhbjpPVF9zZCwgbmFtZXNfdG8gPSAiTWVhc3VyZSIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJWYWx1ZSIpICU+JQogIGRwbHlyOjptdXRhdGUobWVhblNEID0gaWZlbHNlKGdyZXBsKCJfbWVhbiIsTWVhc3VyZSksIk0iLCJzZCIpLAogICAgICAgICAgICAgICAgTWVhc3VyZSA9IGdzdWIoIl9tZWFuIiwiIixNZWFzdXJlKSwKICAgICAgICAgICAgICAgIE1lYXN1cmUgPSBnc3ViKCJfc2QiLCIiLE1lYXN1cmUpLAogICAgICAgICAgICAgICAgRXRpb2xvZ3kgPSBwYXN0ZShFdGlvbG9neSxtZWFuU0QsIHNlcCA9ICJfIiksCiAgICAgICAgICAgICAgICBTZXggPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgIFNleCA9PSAiQWxsIiB+ICJBbGwgU3BlYWtlcnMiLAogICAgICAgICAgICAgICAgICBTZXggPT0gIk0iIH4gIk1hbGUiLAogICAgICAgICAgICAgICAgICBTZXggPT0gIkYiIH4gIkZlbWFsZSIKICAgICAgICAgICAgICAgICkpICU+JQogIGRwbHlyOjpzZWxlY3QoIW1lYW5TRCkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IEV0aW9sb2d5LCB2YWx1ZXNfZnJvbSA9ICJWYWx1ZSIpICU+JQogIGRwbHlyOjpmaWx0ZXIoTWVhc3VyZSAhPSAiVlNENTAiKQoKZ3REYXRhICU+JQogIGd0OjpndCgKICAgIHJvd25hbWVfY29sID0gIk1lYXN1cmUiLAogICAgZ3JvdXBuYW1lX2NvbCA9ICJTZXgiLAogICkgJT4lCiAgZm10X251bWJlcigKICAgIGNvbHVtbnMgPSAnQWxsIEV0aW9sb2dpZXNfTSc6UERfc2QsCiAgICBkZWNpbWFscyA9IDIKICApICU+JQogIHRhYl9zcGFubmVyKAogICAgbGFiZWwgPSAiQWxsIEV0aW9sb2dpZXMiLAogICAgY29sdW1ucyA9IGMoJ0FsbCBFdGlvbG9naWVzX00nLCAnQWxsIEV0aW9sb2dpZXNfc2QnKQogICkgJT4lCiAgICB0YWJfc3Bhbm5lcigKICAgIGxhYmVsID0gIkFMUyIsCiAgICBjb2x1bW5zID0gYyhBTFNfTSwgQUxTX3NkKQogICkgJT4lCiAgdGFiX3NwYW5uZXIoCiAgICBsYWJlbCA9ICJQRCIsCiAgICBjb2x1bW5zID0gYyhQRF9NLCBQRF9zZCkKICApICU+JQogIHRhYl9zcGFubmVyKAogICAgbGFiZWwgPSAiSEQiLAogICAgY29sdW1ucyA9IGMoSERfTSwgSERfc2QpCiAgKSAlPiUKICB0YWJfc3Bhbm5lcigKICAgIGxhYmVsID0gIkF0YXhpYyIsCiAgICBjb2x1bW5zID0gYyhBdGF4aWNfTSwgQXRheGljX3NkKQogICkgJT4lCiAgY29sc19sYWJlbCgKICAgICAnQWxsIEV0aW9sb2dpZXNfTScgPSAiTSIsCiAgICAgJ0FsbCBFdGlvbG9naWVzX3NkJyA9ICJTRCIsCiAgICAgQUxTX00gPSAiTSIsCiAgICAgQUxTX3NkID0gIlNEIiwKICAgICBQRF9NID0gIk0iLAogICAgIFBEX3NkID0gIlNEIiwKICAgICBIRF9NID0gIk0iLAogICAgIEhEX3NkID0gIlNEIiwKICAgICBBdGF4aWNfTSA9ICJNIiwKICAgICBBdGF4aWNfc2QgPSAiU0QiCiAgKSAlPiUKICBndHNhdmUoIkRlc2NyaXB0aXZlc1RhYmxlLmh0bWwiLCBwYXRoID0gIlRhYmxlcyIpCgpgYGAKYGBge3J9CnNqUGxvdDo6dGFiX21vZGVsKE9UX01vZGVsX2ZpbmFsLCBWQVNfTW9kZWxfZmluYWwsCiAgICAgICAgICAgICAgICAgIHNob3cuc2UgPSBULAogICAgICAgICAgICAgICAgICBzdHJpbmcuc2UgPSAiU0UiLAogICAgICAgICAgICAgICAgICBmaWxlID0gIlRhYmxlcy9Nb2RlbCBUYWJsZS5odG1sIikKYGBgCgoKIyBNYW51c2NyaXB0IEZpZ3VyZXMKIyMgRXhhbXBsZSBNZWFzdXJlcwpgYGB7cn0KZm9ybWFudENvbG9yIDwtICJncmV5Igpmb3JtYW50QWxwaGEgPC0gLjk1CmxpbmVDb2xvciA8LSAid2hpdGUiCmxpbmVBbHBoYSA8LSAuOAoKdm93ZWxEYXRhIDwtIHJpbzo6aW1wb3J0KCJQcmVwcGVkIERhdGEvVm93ZWwgRGF0YS5jc3YiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKFNwZWFrZXIgPT0gIkFGOCIpCgogIFBpdGNoX1BSQUFUIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhc3RlKCJQcmVwcGVkIERhdGEvRXhhbXBsZSBEYXRhLyIsIHNlcCA9ICIiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiLlBpdGNoIiwgaWdub3JlLmNhc2UgPSBUKSAlPiUKICAgIHBhc3RlKCJQcmVwcGVkIERhdGEvRXhhbXBsZSBEYXRhLyIsLiwgc2VwID0gIiIpICU+JQogICAgcmVhZC5kZWxpbSguLCBoZWFkZXIgPSBGKSAlPiUKICAgIGRwbHlyOjpyZW5hbWUoUGl0Y2ggPSBWMSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKFBpdGNoID0gZ3N1YigiLS11bmRlZmluZWQtLSIsTkEsUGl0Y2gpLAogICAgICAgICAgICAgICAgICBQaXRjaCA9IGFzLm51bWVyaWMoUGl0Y2gpKQogIAogIEZvcm1hbnRzX1BSQUFUIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhc3RlKCJQcmVwcGVkIERhdGEvRXhhbXBsZSBEYXRhLyIsIHNlcCA9ICIiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiX0Zvcm1hbnQiLCBpZ25vcmUuY2FzZSA9IFQpICU+JQogICAgcGFzdGUoIlByZXBwZWQgRGF0YS9FeGFtcGxlIERhdGEvIiwuLCBzZXAgPSAiIikgJT4lCiAgICByZWFkLmRlbGltKC4sIGhlYWRlciA9IFQpICU+JQogICAgZHBseXI6OnNlbGVjdCghYyhuZm9ybWFudHMsIEIxLkh6LiwgQjIuSHouLCBCMy5Iei4sIEY0Lkh6LiwgQjQuSHouLCBGNS5Iei4sIEI1Lkh6LikpICU+JQogICAgZHBseXI6OnJlbmFtZShUaW1lX3MgPSB0aW1lLnMuLAogICAgICAgICAgICAgICAgICBGMV9IeiA9IEYxLkh6LiwKICAgICAgICAgICAgICAgICAgRjJfSHogPSBGMi5Iei4sCiAgICAgICAgICAgICAgICAgIEYzX0h6ID0gRjMuSHouKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoRjFfSHogPSBpZmVsc2UoRjFfSHogPT0gMCwgTkEsIEYxX0h6KSwKICAgICAgICAgICAgICAgICAgRjJfSHogPSBpZmVsc2UoRjJfSHogPT0gMCwgTkEsIEYyX0h6KSwKICAgICAgICAgICAgICAgICAgRjNfSHogPSBpZmVsc2UoRjNfSHogPT0gMCwgTkEsIEYzX0h6KSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKEYxX0h6ID0gYXMubnVtZXJpYyhGMV9IeiksCiAgICAgICAgICAgICAgICAgIEYyX0h6ID0gYXMubnVtZXJpYyhGMl9IeiksCiAgICAgICAgICAgICAgICAgIEYzX0h6ID0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKEYzX0h6KSksCiAgICAgICAgICAgICAgICAgIFRpbWVfbXMgPSBUaW1lX3MgLyAxMDAwLAogICAgICAgICAgICAgICAgICBGMV9rSHogPSBGMV9IeiAvIDEwMDAsCiAgICAgICAgICAgICAgICAgIEYyX2tIeiA9IEYyX0h6IC8gMTAwMCwKICAgICAgICAgICAgICAgICAgRjNfa0h6ID0gRjNfSHogLyAxMDAwKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoIVRpbWVfcykgJT4lCiAgICBkcGx5cjo6cmVsb2NhdGUoVGltZV9tcywgLmJlZm9yZSA9IEYxX0h6KSAlPiUKICAgIGNiaW5kKC4sUGl0Y2hfUFJBQVQpCiAgCiAgYyA8LSAyCiAgd2hpbGUoYyA8IE5ST1coRm9ybWFudHNfUFJBQVQpKXsKICAgIEZvcm1hbnRzX1BSQUFUJEYxX0h6W2NdIDwtIGlmZWxzZShpcy5uYShGb3JtYW50c19QUkFBVCRGMV9IeltjLTFdKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoRm9ybWFudHNfUFJBQVQkRjFfSHpbYysxXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWFudHNfUFJBQVQkRjFfSHpbY10pCiAgICBGb3JtYW50c19QUkFBVCRGMl9IeltjXSA8LSBpZmVsc2UoaXMubmEoRm9ybWFudHNfUFJBQVQkRjJfSHpbYy0xXSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKEZvcm1hbnRzX1BSQUFUJEYyX0h6W2MrMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hbnRzX1BSQUFUJEYyX0h6W2NdKQogICAgYyA8LSBjICsgMQogIH0KICBybShjKQogIAogIEZvcm1hbnRzX1BSQUFUIDwtIEZvcm1hbnRzX1BSQUFUICU+JQogICAgZHBseXI6OmZpbHRlcighaXMubmEoUGl0Y2gpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoRjFfbWFkID0gKGFicyhGMV9IeiAtIG1lZGlhbihGMV9IeikpLyBtYWQoRjFfSHosIGNvbnN0YW50ID0gMS40ODI2KSkgPiAyLjUsCiAgICAgICAgICAgICAgICAgIEYyX21hZCA9IChhYnMoRjJfSHogLSBtZWRpYW4oRjJfSHopKS8gbWFkKEYyX0h6LCBjb25zdGFudCA9IDEuNDgyNikpID4gMi41KSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoRjFfbWFkID09IEZBTFNFICYgRjJfbWFkID09IEZBTFNFKSAlPiUKICAgIGRwbHlyOjptdXRhdGUobURpc3QgPSBtYWhhbGFub2JpcyhjYmluZCguJEYxX0h6LCAuJEYyX0h6KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xNZWFucyhjYmluZCguJEYxX0h6LCAuJEYyX0h6KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ID0gY292KGNiaW5kKC4kRjFfSHosIC4kRjJfSHopKSksCiAgICAgICAgICAgICAgICAgIG1EaXN0X3NkID0gYWJzKHNjYWxlKG1EaXN0LGNlbnRlciA9IFQpKSkgJT4lCiAgICAjZHBseXI6Om11dGF0ZShtRGlzdE91dGxpZXIgPSAoc3RhdHM6OnBjaGlzcShtRGlzdCwgZGY9MSwgbG93ZXIudGFpbD1GQUxTRSkpIDwgLjAwMSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKG1EaXN0X3NkIDwgMikgJT4lCiAgICBkcGx5cjo6c2VsZWN0KCFjKEYxX21hZCwgRjJfbWFkLCBtRGlzdCwgbURpc3Rfc2QpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoRjFfeiA9IHNjYWxlKEYxX0h6LCBjZW50ZXIgPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgRjJfeiA9IHNjYWxlKEYyX0h6LCBjZW50ZXIgPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgRjNfeiA9IHNjYWxlKEYzX0h6LCBjZW50ZXIgPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgRjFfYiA9IGVtdVI6OmJhcmsoRjFfSHopLAogICAgICAgICAgICAgICAgICBGMl9iID0gZW11Ujo6YmFyayhGMl9IeiksCiAgICAgICAgICAgICAgICAgIEYzX2IgPSBlbXVSOjpiYXJrKEYzX0h6KSkKICAKICBybShQaXRjaF9QUkFBVCkKICAKICAKIyMgQ29ybmVyIERpc3BlcnNpb24gLS0tLQogIHdlZGdlIDwtIHZvd2VsRGF0YSAlPiUKICAgIGRwbHlyOjpncm91cF9ieShWb3dlbCkgJT4lCiAgICBzdW1tYXJpemUobWVhbl9GMSA9IG1lYW4oRjFfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMiA9IG1lYW4oRjJfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMV96ID0gbWVhbihGMV96X3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjJfeiA9IG1lYW4oRjJfel90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YxX2IgPSBtZWFuKEYxX2JfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMl9iID0gbWVhbihGMl9iX3RlbXBNaWQpKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoVm93ZWwgPT0gInYiKQogICAgCiAgY29ybmVyX2RpcyA8LSB2b3dlbERhdGEgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKFZvd2VsICE9ICJ2IikgJT4lCiAgICBkcGx5cjo6Z3JvdXBfYnkoVm93ZWwpICU+JQogICAgc3VtbWFyaXplKG1lYW5fRjEgPSBtZWFuKEYxX3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjIgPSBtZWFuKEYyX3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjFfeiA9IG1lYW4oRjFfel90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YyX3ogPSBtZWFuKEYyX3pfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMV9iID0gbWVhbihGMV9iX3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjJfYiA9IG1lYW4oRjJfYl90ZW1wTWlkKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKFZvd2VsX0VEID0gc3FydCgobWVhbl9GMS13ZWRnZSRtZWFuX0YxKV4yICsgKG1lYW5fRjItd2VkZ2UkbWVhbl9GMileMiksCiAgICAgICAgICAgICAgICAgIFZvd2VsX0VEX3ogPSBzcXJ0KChtZWFuX0YxX3otd2VkZ2UkbWVhbl9GMV96KV4yICsgKG1lYW5fRjJfei13ZWRnZSRtZWFuX0YyX3opXjIpLAogICAgICAgICAgICAgICAgICBWb3dlbF9FRF9iID0gc3FydCgobWVhbl9GMV9iLXdlZGdlJG1lYW5fRjFfYileMiArIChtZWFuX0YyX2Itd2VkZ2UkbWVhbl9GMl9iKV4yKSkKCiAgICAKIyBQbG90IENvcm5lciBEaXNwZXJzaW9uCiAgICAgICMgQ2hhbmdpbmcgdG8gSVBBIHN5bWJvbHMKICAgICAgY29ybmVyX2RpcyA8LSBjb3JuZXJfZGlzICU+JQogICAgICAgIGRwbHlyOjptdXRhdGUoVm93ZWwgPSBjYXNlX3doZW4oCiAgICAgICAgICBWb3dlbCA9PSAiYWUiIH4gIsOmIiwKICAgICAgICAgIFRSVUUgfiBWb3dlbAogICAgICAgICkpCiAgICAgIAogICAgICB3ZWRnZSA8LSB3ZWRnZSAlPiUKICAgICAgICBkcGx5cjo6bXV0YXRlKFZvd2VsID0gY2FzZV93aGVuKAogICAgICAgICAgVm93ZWwgPT0gInYiIH4gIsqMIiwKICAgICAgICAgIFRSVUUgfiBWb3dlbAogICAgICAgICkpCiAgICAgIAogICAgICBDRHBsb3QgPC0gZ2dwbG90KGFlcyh4PUYyX2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9RjFfYiksCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEZvcm1hbnRzX1BSQUFULAogICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UpICsgCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwKICAgICAgICAgICAgICAgICBhbHBoYSA9IGZvcm1hbnRBbHBoYSwKICAgICAgICAgICAgICAgICBjb2xvciA9IGZvcm1hbnRDb2xvcikgKyAKICAgICAgZ2VvbV9saW5lKGFlcyh4ID0gbWVhbl9GMl9iLAogICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuX0YxX2IpLAogICAgICAgICAgICAgICAgZGF0YSA9IGNvcm5lcl9kaXMgJT4lCiAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QoVm93ZWw6bWVhbl9GMl9iKSAlPiUKICAgICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihWb3dlbCA9PSAiaSIpICU+JQogICAgICAgICAgICAgICAgICByYmluZCguLHdlZGdlKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gbGluZUNvbG9yLAogICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSwKICAgICAgICAgICAgICAgIGFscGhhID0gbGluZUFscGhhKSArCiAgICAgIGdlb21fbGluZShhZXMoeCA9IG1lYW5fRjJfYiwKICAgICAgICAgICAgICAgICAgICB5ID0gbWVhbl9GMV9iKSwKICAgICAgICAgICAgICAgIGRhdGEgPSBjb3JuZXJfZGlzICU+JQogICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KFZvd2VsOm1lYW5fRjJfYikgJT4lCiAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoVm93ZWwgPT0gImEiKSAlPiUKICAgICAgICAgICAgICAgICAgcmJpbmQoLix3ZWRnZSksCiAgICAgICAgICAgICAgICBjb2xvciA9IGxpbmVDb2xvciwKICAgICAgICAgICAgICAgIHNpemUgPSAxLjUsCiAgICAgICAgICAgICAgICBhbHBoYSA9IGxpbmVBbHBoYSkgKwogICAgICBnZW9tX2xpbmUoYWVzKHggPSBtZWFuX0YyX2IsCiAgICAgICAgICAgICAgICAgICAgeSA9IG1lYW5fRjFfYiksCiAgICAgICAgICAgICAgICBkYXRhID0gY29ybmVyX2RpcyAlPiUKICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChWb3dlbDptZWFuX0YyX2IpICU+JQogICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKFZvd2VsID09ICLDpiIpICU+JQogICAgICAgICAgICAgICAgICByYmluZCguLHdlZGdlKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gbGluZUNvbG9yLAogICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSwKICAgICAgICAgICAgICAgIGFscGhhID0gbGluZUFscGhhKSArCiAgICAgIGdlb21fbGluZShhZXMoeCA9IG1lYW5fRjJfYiwKICAgICAgICAgICAgICAgICAgICB5ID0gbWVhbl9GMV9iKSwKICAgICAgICAgICAgICAgIGRhdGEgPSBjb3JuZXJfZGlzICU+JQogICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KFZvd2VsOm1lYW5fRjJfYikgJT4lCiAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoVm93ZWwgPT0gInUiKSAlPiUKICAgICAgICAgICAgICAgICAgcmJpbmQoLix3ZWRnZSksCiAgICAgICAgICAgICAgICBjb2xvciA9IGxpbmVDb2xvciwKICAgICAgICAgICAgICAgIHNpemUgPSAxLjUsCiAgICAgICAgICAgICAgICBhbHBoYSA9IGxpbmVBbHBoYSkgKwogICAgICBnZW9tX3BvaW50KGFlcyh4ID0gbWVhbl9GMl9iLAogICAgICAgICAgICAgICAgICAgICB5ID0gbWVhbl9GMV9iLAogICAgICAgICAgICAgICAgICAgICBjb2xvciA9IFZvd2VsKSwKICAgICAgICAgICAgICAgICBkYXRhID0gY29ybmVyX2RpcyAlPiUKICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChWb3dlbDptZWFuX0YyX2IpICU+JQogICAgICAgICAgICAgICAgICByYmluZCguLHdlZGdlKSwKICAgICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLAogICAgICAgICAgICAgICAgIHNpemUgPSA1KSArCiAgICAgIHNjYWxlX3lfcmV2ZXJzZSgpICsKICAgICAgc2NhbGVfeF9yZXZlcnNlKCkgKwogICAgICB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHRpdGxlID0gcGFzdGUoIkNvcm5lciBEaXNwZXJzaW9uIikpICsgeGxhYigiRjIgKGJhcmspIikgKyB5bGFiKCJGMSAoYmFyaykiKSArCiAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICBhc3BlY3QucmF0aW8gPSAxKSArCiAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYSIgPSAiIzFBQUQ3NyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiw6YiID0gIiMxMjc5QjUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkiID0gIiNGRkJGMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInUiID0gIiNGRDc4NTMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIsqMIiA9ICIjQkYzMTc4IikpCiAgICBDRHBsb3QKICAgIAogICAgICBybShjb3JuZXJfZGlzLCB3ZWRnZSkKICAgICAgCiMjIFZvd2VsIFNwYWNlIEFyZWEgLS0tLQogIFZTQV9jb29yZHMgPC0gdm93ZWxEYXRhICU+JQogICAgZHBseXI6OmZpbHRlcihWb3dlbCAhPSAidiIpICU+JQogICAgZHBseXI6Omdyb3VwX2J5KFZvd2VsKSAlPiUKICAgIHN1bW1hcml6ZShtZWFuX0YxID0gbWVhbihGMV90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YyID0gbWVhbihGMl90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YxX3ogPSBtZWFuKEYxX3pfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMl96ID0gbWVhbihGMl96X3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjFfYiA9IG1lYW4oRjFfYl90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YyX2IgPSBtZWFuKEYyX2JfdGVtcE1pZCkpIAogIAojIyMgUGxvdHRpbmcgVlNBCiAgICBWU0FfY29vcmRzIDwtIFZTQV9jb29yZHMgJT4lCiAgICAgICAgZHBseXI6Om11dGF0ZShWb3dlbCA9IGNhc2Vfd2hlbigKICAgICAgICAgIFZvd2VsID09ICJhZSIgfiAiw6YiLAogICAgICAgICAgVFJVRSB+IFZvd2VsCiAgICAgICAgKSkKICAgIAogICAgVlNBcGxvdCA8LSBnZ3Bsb3QoYWVzKHggPSBGMl9iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBGMV9iKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBGb3JtYW50c19QUkFBVCwKICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UpICsgCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwKICAgICAgICAgICAgICAgICBhbHBoYSA9IGZvcm1hbnRBbHBoYSwKICAgICAgICAgICAgICAgICBjb2xvciA9IGZvcm1hbnRDb2xvcikgKyAKICAgICAgZ2VvbV9wb2x5Z29uKGFlcyh4ID0gbWVhbl9GMl9iLAogICAgICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuX0YxX2IpLAogICAgICAgICAgICAgICAgICAgZGF0YSA9IFZTQV9jb29yZHMsCiAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGxpbmVBbHBoYSwKICAgICAgICAgICAgICAgICAgIGNvbG9yID0gbGluZUNvbG9yLAogICAgICAgICAgICAgICAgICAgZmlsbD1OQSwKICAgICAgICAgICAgICAgICAgIHNpemUgPSAxLjUpICsKICAgICAgZ2VvbV9wb2ludChhZXMoeCA9IG1lYW5fRjJfYiwKICAgICAgICAgICAgICAgICAgICAgeSA9IG1lYW5fRjFfYiwKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBWb3dlbCksCiAgICAgICAgICAgICAgICAgZGF0YSA9IFZTQV9jb29yZHMsCiAgICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICBzaXplID0gNSkgKwogICAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX3hfcmV2ZXJzZSgpICsKICAgICAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICAgICAgdGhlbWVfY2xhc3NpYygpICsgbGFicyh0aXRsZSA9ICJWU0EiKSArIHhsYWIoIkYyIChiYXJrKSIpICsgeWxhYigiRjEgKGJhcmspIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkgKwogICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImEiID0gIiMxQUFENzciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIsOmIiA9ICIjMTI3OUI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpIiA9ICIjRkZCRjAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1IiA9ICIjRkQ3ODUzIikpCiAgICBWU0FwbG90CiAgCiAgcm0oVlNBX2Nvb3JkcykKICAKIyMgSHVsbCAtLS0tCgojIyMgUGxvdHRpbmcgSHVsbAogICAgICBjb252ZXhDb29yZHMgPC0gRm9ybWFudHNfUFJBQVQgJT4lCiAgICAgICAgZHBseXI6OnNlbGVjdChGMV9iLCBGMl9iKSAlPiUKICAgICAgICBhcy5tYXRyaXgoKSAlPiUKICAgICAgICBnckRldmljZXM6OmNodWxsKCkKICAgICAgY29udmV4IDwtIEZvcm1hbnRzX1BSQUFUICU+JQogICAgICAgIHNsaWNlKGNvbnZleENvb3JkcykKCiAgICAgIGh1bGxQbG90IDwtIGdncGxvdChhZXMoRjJfYiwgRjFfYiksCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRm9ybWFudHNfUFJBQVQpICsKICAgICAgICBnZW9tX3BvaW50KHNoYXBlID0gMjEsCiAgICAgICAgICAgICAgICAgYWxwaGEgPSBmb3JtYW50QWxwaGEsCiAgICAgICAgICAgICAgICAgY29sb3IgPSBmb3JtYW50Q29sb3IpICsKICAgICAgICBnZW9tX3BvbHlnb24oZGF0YSA9IGNvbnZleCwKICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAuNSwKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyNzlCNSIsCiAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBOQSwKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSkgKwogICAgICAgIHNjYWxlX3lfcmV2ZXJzZSgpICsKICAgICAgICBzY2FsZV94X3JldmVyc2UoKSArCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsgbGFicyh0aXRsZSA9ICJWU0EgSHVsbCIpICsgeGxhYigiRjIgKGJhcmspIikgKyB5bGFiKCJGMSAoYmFyaykiKSArCiAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQogICAgICBodWxsUGxvdAogICAgCiAgCiMjIFZvd2VsIFNwYWNlIERlbnNpdHkgLS0tLQoKIyMgQmFyayBOb3JtYWxpemVkIERlbnNpdHkgLS0tLQojIHNlbGVjdGluZyB0aGUgYmFuZHdpZHRoCkhfaHBpIDwtIGtzOjpIcGkoeCA9IEZvcm1hbnRzX1BSQUFUWyxjKCJGMl9iIiwiRjFfYiIpXSwgcGlsb3QgPSAic2Ftc2UiLCBwcmUgPSAic2NhbGUiLCBiaW5uZWQgPSBUKQoKIyBjb21wdXRlIDJkIGtkZQprIDwtIGtkZSh4ID0gRm9ybWFudHNfUFJBQVRbLGMoIkYyX2IiLCJGMV9iIildLAogICAgICAgICBIID0gSF9ocGksCiAgICAgICAgIGJpbm5lZCA9IFQsCiAgICAgICAgIGdyaWRzaXplID0gMjUwKQoKI2RlbnNpdHkgPC0ga1tbImVzdGltYXRlIl1dCgojIEJlZm9yZSB3ZSBjYW4gcGxvdCB0aGUgZGVuc2l0eSBlc3RpbWF0ZSB3ZSBuZWVkIHRvIG1lbHQgaXQgaW50byBsb25nIGZvcm1hdAptYXQubWVsdGVkIDwtIGRhdGEudGFibGU6Om1lbHQoayRlc3RpbWF0ZSkKbmFtZXMobWF0Lm1lbHRlZCkgPC0gYygieCIsICJ5IiwgImRlbnNpdHkiKQoKIyBXZSBuZWVkIHRvIGFkZCB0d28gbW9yZSBjb2x1bXMgdG8gcHJlc2VydmUgdGhlIGF4ZXMgdW5pdHMKbWF0Lm1lbHRlZCRGMi5iIDwtIHJlcChrJGV2YWwucG9pbnRzW1sxXV0sIHRpbWVzID0gbnJvdyhrJGVzdGltYXRlKSkKbWF0Lm1lbHRlZCRGMS5iIDwtIHJlcChrJGV2YWwucG9pbnRzW1syXV0sIGVhY2ggPSBucm93KGskZXN0aW1hdGUpKQptYXQubWVsdGVkJGRlbnNpdHkgPC0gc2NhbGVzOjpyZXNjYWxlKG1hdC5tZWx0ZWQkZGVuc2l0eSwgdG8gPSBjKDAsIDEpKQoKIyBWU0QgLSAyNQpuVlNEXzI1IDwtIG1hdC5tZWx0ZWQgJT4lCiAgZHBseXI6OmZpbHRlcihkZW5zaXR5ID4gLjI1KSAlPiUKICBkcGx5cjo6c2VsZWN0KEYyLmIsRjEuYikKCmNvbnZleENvb3JkcyA8LSBuVlNEXzI1ICU+JQogIGRwbHlyOjpzZWxlY3QoRjIuYiwgRjEuYikgJT4lCiAgYXMubWF0cml4KCkgJT4lCiAgI2dyRGV2aWNlczo6eHkuY29vcmRzKCkgJT4lCiAgZ3JEZXZpY2VzOjpjaHVsbCgpCm5jb252ZXhfMjUgPC0gblZTRF8yNSAlPiUKICBzbGljZShjb252ZXhDb29yZHMpCgojIFZTRCAtIDc1Cm5WU0RfNzUgPC0gbWF0Lm1lbHRlZCAlPiUKICBkcGx5cjo6ZmlsdGVyKGRlbnNpdHkgPiAuNzUpICU+JQogIGRwbHlyOjpzZWxlY3QoRjIuYixGMS5iKQoKY29udmV4Q29vcmRzIDwtIG5WU0RfNzUgJT4lCiAgZHBseXI6OnNlbGVjdChGMi5iLCBGMS5iKSAlPiUKICBhcy5tYXRyaXgoKSAlPiUKICBnckRldmljZXM6OmNodWxsKCkKbmNvbnZleF83NSA8LSBuVlNEXzc1ICU+JQogIHNsaWNlKGNvbnZleENvb3JkcykKCiMgUGxvdHRpbmcgWiBOb3JtYWxpemVkIFZTRCAKICAgIHJmIDwtIGNvbG9yUmFtcFBhbGV0dGUocmV2KFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCgxMSwgIlNwZWN0cmFsIikpKQogICAgciA8LSByZigzMikKCiAgICBWU0RwbG90IDwtIGdncGxvdChkYXRhID0gbWF0Lm1lbHRlZCAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnJlbmFtZShEZW5zaXR5ID0gZGVuc2l0eSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjptdXRhdGUoVlNEbGFiZWwgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2l0eSA8IC4yNSB+ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zaXR5ID4gLjI1ICYmIERlbnNpdHkgPCAuNzUgfiAiVlNEMjUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiVlNENzUiCiAgICAgICAgICAgICAgICAgICAgICAgICkpLAogICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBGMi5iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBGMS5iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBEZW5zaXR5KSkgKyAKICAgICAgZ2VvbV90aWxlKCkgKyAKICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IHIpICsKICAgICAgc2NhbGVfeF9yZXZlcnNlKGV4cGFuZCA9IGMoMCwgMCksIAogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gcm91bmQoc2VxKG1pbihtYXQubWVsdGVkJEYyLmIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgobWF0Lm1lbHRlZCRGMi5iKSkpKSArCiAgICAgIHNjYWxlX3lfcmV2ZXJzZShleHBhbmQgPSBjKDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gcm91bmQoc2VxKG1pbihtYXQubWVsdGVkJEYxLmIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChtYXQubWVsdGVkJEYxLmIpKSkpICsgCiAgICAgIHlsYWIoIkYxIChiYXJrKSIpICsgeGxhYigiRjIgKGJhcmspIikgKwogICAgICBsYWJzKHRpdGxlID0gIlZTRCBIdWxsIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkgKwogICAgICBnZW9tX3BvbHlnb24oZGF0YSA9IG5jb252ZXhfMjUsIGFscGhhID0gbGluZUFscGhhLCBjb2xvciA9IGxpbmVDb2xvciwgc2l6ZSA9IDEuNSwgZmlsbCA9IE5BKSArCiAgICAgIGdlb21fcG9seWdvbihkYXRhID0gbmNvbnZleF83NSwgYWxwaGEgPSBsaW5lQWxwaGEsIGNvbG9yID0gbGluZUNvbG9yLCBzaXplID0gMS41LCBmaWxsID0gTkEpCiAgICBWU0RwbG90CiAgICAKCgojIENvbWJpbmVkIFBsb3QKCm1lYXN1cmVzUGxvdCA8LSBWU0FwbG90ICsgQ0RwbG90ICsgaHVsbFBsb3QgKyBWU0RwbG90ICsKICAgICAgcGF0Y2h3b3JrOjpwbG90X2xheW91dChndWlkZXMgPSAnY29sbGVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpCgpnZ3NhdmUoZmlsZW5hbWUgPSAiUGxvdHMvTWVhc3VyZXMucG5nIiwKICAgICAgIHBsb3QgPSBtZWFzdXJlc1Bsb3QsCiAgICAgICBoZWlnaHQgPSA3LAogICAgICAgd2lkdGggPSA4LAogICAgICAgc2NhbGUgPSAuOCkKCmBgYAoKIyMgRmlsdGVyaW5nIFByb2Nlc3MKYGBge3J9CmZvcm1hbnRBbHBoYSA8LSAuMjAKbXlQYWwgPC0gYygiIzEyNzlCNSIsIiMyRDJEMzciKQoKUGl0Y2hfUFJBQVQgPC0gbGlzdC5maWxlcyhwYXRoID0gcGFzdGUoIlByZXBwZWQgRGF0YS9FeGFtcGxlIERhdGEvIiwgc2VwID0gIiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICIuUGl0Y2giLCBpZ25vcmUuY2FzZSA9IFQpICU+JQogICAgcGFzdGUoIlByZXBwZWQgRGF0YS9FeGFtcGxlIERhdGEvIiwuLCBzZXAgPSAiIikgJT4lCiAgICByZWFkLmRlbGltKC4sIGhlYWRlciA9IEYpICU+JQogICAgZHBseXI6OnJlbmFtZShQaXRjaCA9IFYxKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoUGl0Y2ggPSBnc3ViKCItLXVuZGVmaW5lZC0tIixOQSxQaXRjaCksCiAgICAgICAgICAgICAgICAgIFBpdGNoID0gYXMubnVtZXJpYyhQaXRjaCkpCgpGb3JtYW50c19QUkFBVCA8LSBsaXN0LmZpbGVzKHBhdGggPSBwYXN0ZSgiUHJlcHBlZCBEYXRhL0V4YW1wbGUgRGF0YS8iLCBzZXAgPSAiIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIl9Gb3JtYW50IiwgaWdub3JlLmNhc2UgPSBUKSAlPiUKICAgIHBhc3RlKCJQcmVwcGVkIERhdGEvRXhhbXBsZSBEYXRhLyIsLiwgc2VwID0gIiIpICU+JQogICAgcmVhZC5kZWxpbSguLCBoZWFkZXIgPSBUKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoIWMobmZvcm1hbnRzLCBCMS5Iei4sIEIyLkh6LiwgQjMuSHouLCBGNC5Iei4sIEI0Lkh6LiwgRjUuSHouLCBCNS5Iei4pKSAlPiUKICAgIGRwbHlyOjpyZW5hbWUoVGltZV9zID0gdGltZS5zLiwKICAgICAgICAgICAgICAgICAgRjFfSHogPSBGMS5Iei4sCiAgICAgICAgICAgICAgICAgIEYyX0h6ID0gRjIuSHouLAogICAgICAgICAgICAgICAgICBGM19IeiA9IEYzLkh6LikgJT4lCiAgICBkcGx5cjo6bXV0YXRlKEYxX0h6ID0gaWZlbHNlKEYxX0h6ID09IDAsIE5BLCBGMV9IeiksCiAgICAgICAgICAgICAgICAgIEYyX0h6ID0gaWZlbHNlKEYyX0h6ID09IDAsIE5BLCBGMl9IeiksCiAgICAgICAgICAgICAgICAgIEYzX0h6ID0gaWZlbHNlKEYzX0h6ID09IDAsIE5BLCBGM19IeikpICU+JQogICAgZHBseXI6Om11dGF0ZShGMV9IeiA9IGFzLm51bWVyaWMoRjFfSHopLAogICAgICAgICAgICAgICAgICBGMl9IeiA9IGFzLm51bWVyaWMoRjJfSHopLAogICAgICAgICAgICAgICAgICBGM19IeiA9IHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhGM19IeikpLAogICAgICAgICAgICAgICAgICBUaW1lX21zID0gVGltZV9zIC8gMTAwMCwKICAgICAgICAgICAgICAgICAgRjFfa0h6ID0gRjFfSHogLyAxMDAwLAogICAgICAgICAgICAgICAgICBGMl9rSHogPSBGMl9IeiAvIDEwMDAsCiAgICAgICAgICAgICAgICAgIEYzX2tIeiA9IEYzX0h6IC8gMTAwMCwKICAgICAgICAgICAgICAgICAgRjFfYiA9IGVtdVI6OmJhcmsoRjFfSHopLAogICAgICAgICAgICAgICAgICBGMl9iID0gZW11Ujo6YmFyayhGMl9IeiksCiAgICAgICAgICAgICAgICAgIEYzX2IgPSBlbXVSOjpiYXJrKEYzX0h6KSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KCFUaW1lX3MpICU+JQogICAgZHBseXI6OnJlbG9jYXRlKFRpbWVfbXMsIC5iZWZvcmUgPSBGMV9IeikgJT4lCiAgICBjYmluZCguLFBpdGNoX1BSQUFUKQogIAogIGMgPC0gMgogIHdoaWxlKGMgPCBOUk9XKEZvcm1hbnRzX1BSQUFUKSl7CiAgICBGb3JtYW50c19QUkFBVCRGMV9IeltjXSA8LSBpZmVsc2UoaXMubmEoRm9ybWFudHNfUFJBQVQkRjFfSHpbYy0xXSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKEZvcm1hbnRzX1BSQUFUJEYxX0h6W2MrMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hbnRzX1BSQUFUJEYxX0h6W2NdKQogICAgRm9ybWFudHNfUFJBQVQkRjJfSHpbY10gPC0gaWZlbHNlKGlzLm5hKEZvcm1hbnRzX1BSQUFUJEYyX0h6W2MtMV0pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShGb3JtYW50c19QUkFBVCRGMl9IeltjKzFdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYW50c19QUkFBVCRGMl9IeltjXSkKICAgIGMgPC0gYyArIDEKICB9CiAgcm0oYykKICAKICAjIFJhdyBGb3JtYW50cyAtLS0tCiAgZjEgPC0gZ2dwbG90KGFlcyh4PUYyX2IsCiAgICAgICAgICAgICAgICAgICB5PUYxX2IpLAogICAgICAgICAgICAgICBkYXRhID0gRm9ybWFudHNfUFJBQVQpICsgCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgY29sb3IgPSBteVBhbFsyXSkgKwogICAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX3hfcmV2ZXJzZSgpICsKICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15UGFsKSArCiAgICAgIHRoZW1lX2NsYXNzaWMoKSArIGxhYnModGl0bGUgPSBwYXN0ZSgiUmF3IEZvcm1hbnQgVmFsdWVzIikpICsgeGxhYigiRjIgKGJhcmspIikgKyB5bGFiKCJGMSAoYmFyaykiKSArCiAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICBhc3BlY3QucmF0aW8gPSAxLAogICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKQogICAgCiMgU3RlcCAjMTogVm9pY2VkIFNlZ21lbnRzIC0tLS0KICAgIHBsb3REYXRhIDwtIEZvcm1hbnRzX1BSQUFUICU+JQogICAgICAgICAgICAgICAgICAgZHBseXI6Om11dGF0ZShpc091dGxpZXIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgIGlzLm5hKFBpdGNoKSB+ICJSZW1vdmVkIiwKICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJSZXRhaW5lZCIKICAgICAgICAgICAgICAgICAgICkpCiAgICBmMiA8LSBnZ3Bsb3QoZGF0YSA9IHBsb3REYXRhLAogICAgICAgICAgICAgICAgIGFlcyh4ID0gRjJfYiwKICAgICAgICAgICAgICAgICAgICAgeSA9IEYxX2IsCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaXNPdXRsaWVyKSkgKyAKICAgICAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBkYXRhID0gcGxvdERhdGEgJT4lCiAgICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGlzT3V0bGllciA9PSAiUmVtb3ZlZCIpKSArCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgZGF0YSA9IHBsb3REYXRhICU+JQogICAgICAgICAgICAgZHBseXI6OmZpbHRlcihpc091dGxpZXIgPT0gIlJldGFpbmVkIikpICsKICAgICAgc2NhbGVfeV9yZXZlcnNlKCkgKwogICAgICBzY2FsZV94X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBteVBhbCkgKwogICAgICB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHRpdGxlID0gcGFzdGUoIlN0ZXAgIzE6XG5Wb2ljZWQgU2VnbWVudHMiKSkgKwogICAgICB4bGFiKCJGMiAoYmFyaykiKSArCiAgICAgIHlsYWIoIkYxIChiYXJrKSIpICsKICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICAgICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsCiAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpCiAgICAKIyBTdGVwIDI6IE1BRCAtLS0tCiAgICBwbG90RGF0YSA8LSBGb3JtYW50c19QUkFBVCAlPiUKICAgICAgZHBseXI6OmZpbHRlcighaXMubmEoUGl0Y2gpKSAlPiUKICAgICAgZHBseXI6Om11dGF0ZShGMV9tYWQgPSAoYWJzKEYxX0h6IC0gbWVkaWFuKEYxX0h6KSkvIG1hZChGMV9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgICBGMl9tYWQgPSAoYWJzKEYyX0h6IC0gbWVkaWFuKEYyX0h6KSkvIG1hZChGMl9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgICBpc091dGxpZXIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgICBGMV9tYWQgPT0gVFJVRSB8IEYyX21hZCA9PSBUUlVFIH4gIlJlbW92ZWQiLAogICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJSZXRhaW5lZCIKICAgICAgICAgICAgICAgKSkKICAgIAogICAgZjMgPC0gZ2dwbG90KGRhdGEgPSBwbG90RGF0YSwKICAgICAgICAgICAgICAgICBhZXMoeCA9IEYyX2IsCiAgICAgICAgICAgICAgICAgICAgIHkgPSBGMV9iLAogICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGlzT3V0bGllcikpICsgCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgZGF0YSA9IHBsb3REYXRhICU+JQogICAgICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihpc091dGxpZXIgPT0gIlJlbW92ZWQiKSkgKwogICAgICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIGRhdGEgPSBwbG90RGF0YSAlPiUKICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaXNPdXRsaWVyID09ICJSZXRhaW5lZCIpKSArCiAgICAgIHNjYWxlX3lfcmV2ZXJzZSgpICsKICAgICAgc2NhbGVfeF9yZXZlcnNlKCkgKwogICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICAgICAgdGhlbWVfY2xhc3NpYygpICsKICAgICAgbGFicyh0aXRsZSA9IHBhc3RlKCJTdGVwICMyOlxuTWVkaWFuIEFic29sdXRlIERldmlhdGlvbiIpKSArCiAgICAgIHhsYWIoIkYyIChiYXJrKSIpICsKICAgICAgeWxhYigiRjEgKGJhcmspIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwKICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkKICAgIAojIFN0ZXAgMzogTWFoYWxhbmhvYmlzIERpc3RhbmNlIC0tLS0KICBwbG90RGF0YSA8LSBGb3JtYW50c19QUkFBVCAlPiUKICAgICAgZHBseXI6OmZpbHRlcighaXMubmEoUGl0Y2gpKSAlPiUKICAgICAgZHBseXI6Om11dGF0ZShGMV9tYWQgPSAoYWJzKEYxX0h6IC0gbWVkaWFuKEYxX0h6KSkvIG1hZChGMV9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgICBGMl9tYWQgPSAoYWJzKEYyX0h6IC0gbWVkaWFuKEYyX0h6KSkvIG1hZChGMl9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSkgJT4lCiAgICAgIGRwbHlyOjpmaWx0ZXIoRjFfbWFkID09IEZBTFNFICYgRjJfbWFkID09IEZBTFNFKSAlPiUKICAgICAgZHBseXI6Om11dGF0ZShtRGlzdCA9IG1haGFsYW5vYmlzKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbE1lYW5zKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSBjb3YoY2JpbmQoLiRGMV9IeiwgLiRGMl9IeikpKSwKICAgICAgICAgICAgICAgICAgbURpc3Rfc2QgPSBhYnMoc2NhbGUobURpc3QsY2VudGVyID0gVCkpLAogICAgICAgICAgICAgICAgICBpc091dGxpZXIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgbURpc3Rfc2QgPCAyIH4gIlJldGFpbmVkIiwKICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIlJlbW92ZWQiCiAgICAgICAgICAgICAgICAgICkpCiAgICAKICAgIGY0IDwtIGdncGxvdChkYXRhID0gcGxvdERhdGEsCiAgICAgICAgICAgICAgICAgYWVzKHggPSBGMl9iLAogICAgICAgICAgICAgICAgICAgICB5ID0gRjFfYiwKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBpc091dGxpZXIpKSArIAogICAgICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIGRhdGEgPSBwbG90RGF0YSAlPiUKICAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaXNPdXRsaWVyID09ICJSZW1vdmVkIikpICsKICAgICAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBkYXRhID0gcGxvdERhdGEgJT4lCiAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGlzT3V0bGllciA9PSAiUmV0YWluZWQiKSkgKwogICAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX3hfcmV2ZXJzZSgpICsKICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15UGFsKSArCiAgICAgIHRoZW1lX2NsYXNzaWMoKSArIGxhYnModGl0bGUgPSBwYXN0ZSgiU3RlcCAjMzpcbk1haGFsYW5vYmlzIERpc3RhbmNlIikpICsgeGxhYigiRjIgKGJhcmspIikgKyB5bGFiKCJGMSAoYmFyaykiKSArCiAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICBhc3BlY3QucmF0aW8gPSAxLAogICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKQogICAgCiMgRmluYWwgRm9ybWFudHMgLS0tLQogICAgcGxvdERhdGEgPC0gRm9ybWFudHNfUFJBQVQgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShQaXRjaCkpICU+JQogICAgZHBseXI6Om11dGF0ZShGMV9tYWQgPSAoYWJzKEYxX0h6IC0gbWVkaWFuKEYxX0h6KSkvIG1hZChGMV9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgRjJfbWFkID0gKGFicyhGMl9IeiAtIG1lZGlhbihGMl9IeikpLyBtYWQoRjJfSHosIGNvbnN0YW50ID0gMS40ODI2KSkgPiAyLjUpICU+JQogICAgZHBseXI6OmZpbHRlcihGMV9tYWQgPT0gRkFMU0UgJiBGMl9tYWQgPT0gRkFMU0UpICU+JQogICAgZHBseXI6Om11dGF0ZShtRGlzdCA9IG1haGFsYW5vYmlzKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbE1lYW5zKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSBjb3YoY2JpbmQoLiRGMV9IeiwgLiRGMl9IeikpKSwKICAgICAgICAgICAgICAgICAgbURpc3Rfc2QgPSBhYnMoc2NhbGUobURpc3QsY2VudGVyID0gVCkpKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIobURpc3Rfc2QgPCAyKQogICAgCiAgICBmNSA8LSBnZ3Bsb3QoYWVzKHg9RjJfYiwKICAgICAgICAgICAgICAgICAgICAgeT1GMV9iKSwKICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcGxvdERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKyAKICAgICAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBjb2xvciA9IG15UGFsWzJdKSArIAogICAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX3hfcmV2ZXJzZSgpICsKICAgICAgdGhlbWVfY2xhc3NpYygpICsgbGFicyh0aXRsZSA9IHBhc3RlKCJGaW5hbCBGb3JtYW50IFZhbHVlcyIpKSArIHhsYWIoIkYyIChiYXJrKSIpICsgeWxhYigiRjEgKGJhcmspIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQogICAgCiMgQ29taWJpbmcgcGxvdHMKICAgIGZpbHRlcmVkUGxvdCA8LSBmMSArIGYyICsgZjMgKyBmNCArIGY1ICsgcGF0Y2h3b3JrOjpndWlkZV9hcmVhKCkgKwogICAgICBwYXRjaHdvcms6OnBsb3RfbGF5b3V0KGd1aWRlcyA9ICdjb2xsZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAzKQogICAgZmlsdGVyZWRQbG90CiAgICAKICAgIGdnc2F2ZShwbG90ID0gZmlsdGVyZWRQbG90LCAiUGxvdHMvRmlsdGVyZWQgRm9ybWFudHMucG5nIiwKICAgICAgICAgICBoZWlnaHQgPSA2LAogICAgICAgICAgIHdpZHRoID0gOCwKICAgICAgICAgICB1bml0cyA9ICJpbiIsCiAgICAgICAgICAgc2NhbGUgPSAuOSkKICAKYGBgCgojIyBPVCB2cy4gVkFTCmBgYHtyfQpwbG90RGF0YV9JbnQgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpmaWx0ZXIoIWdyZXBsKCJfcmVsIiwgU3BlYWtlcikpICU+JQogIGRwbHlyOjpncm91cF9ieShTcGVha2VyKSAlPiUKICBkcGx5cjo6bXV0YXRlKHNlZ01pbiA9IGJhc2U6Om1pbihWQVMsIHRyYW5zQWNjKSwKICAgICAgICAgICAgICAgIHNlZ01heCA9IGJhc2U6Om1heChWQVMsIHRyYW5zQWNjKSwKICAgICAgICAgICAgICAgIHJhdGluZ0F2ZyA9IG1lYW4oVkFTLCB0cmFuc0FjYywgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgIFNwZWFrZXIgPSBhcy5mYWN0b3IoU3BlYWtlciksCiAgICAgICAgICAgICAgICBFdGlvbG9neSA9IGFzLmZhY3RvcihFdGlvbG9neSkpICU+JQogIGFycmFuZ2Uoc2VnTWF4KQoKbXlfcGFsIDwtIGMoIiNmMjY0MzAiLCAiIzI3MkQyRCIsIiMyNTZlZmYiKQojIFdpdGggYSBiaXQgbW9yZSBzdHlsZQpwbG90X0ludCA8LSBnZ3Bsb3QocGxvdERhdGFfSW50KSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gZmN0X2lub3JkZXIoU3BlYWtlciksCiAgICAgICAgICAgICAgICAgICB4ZW5kID0gU3BlYWtlciwKICAgICAgICAgICAgICAgICAgIHkgPSBzZWdNaW4sCiAgICAgICAgICAgICAgICAgICB5ZW5kID0gc2VnTWF4LAogICAgICAgICAgICAgICAgICAgY29sb3IgPSBFdGlvbG9neSkpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gU3BlYWtlciwKICAgICAgICAgICAgICAgICB5ID0gVkFTLAogICAgICAgICAgICAgICAgIGNvbG9yID0gRXRpb2xvZ3kpLAogICAgICAgICAgICAgI2NvbG9yID0gbXlfcGFsWzFdLAogICAgICAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgICAgICBzaGFwZSA9IDE5KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IFNwZWFrZXIsCiAgICAgICAgICAgICAgICAgeSA9IHRyYW5zQWNjLAogICAgICAgICAgICAgICAgIGNvbG9yID0gRXRpb2xvZ3kpLAogICAgICAgICAgICAgI2NvbG9yID0gbXlfcGFsWzJdLAogICAgICAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgICAgICBzaGFwZSA9IDE1KSArCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlNwZWVjaCBJbnRlbGxpZ2liaWxpdHkiKSArCiAgZ2d0aXRsZSgiU3BlZWNoIEludGVsbGlnaWJpbGl0eSIpICsKICB5bGltKGMoMCwxMDApKQpwbG90X0ludAoKc2NhdHRlciA8LSBnZ3Bsb3QocGxvdERhdGFfSW50LAogICAgICAgICAgICAgICAgICBhZXMoeCA9IHRyYW5zQWNjLAogICAgICAgICAgICAgICAgIHkgPSBWQVMpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBFdGlvbG9neSkpICsKICAjZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLDEwMCksIHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCnNjYXR0ZXIKYGBgCiMjIE1vZGVsIFNjYXR0ZXJwbG90CgpgYGB7cn0KbW9kZWxGaWd1cmVEYXRhIDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFncmVwbCgiX3JlbCIsU3BlYWtlcikpICU+JQogIGRwbHlyOjpzZWxlY3QoU3BlYWtlciwgRXRpb2xvZ3ksIFNleCwgVlNBX2IsIHZvd2VsX0VEX2IsIEh1bGxfYiwgSHVsbF9iVlNEXzI1LCBIdWxsX2JWU0RfNzUsIFZBUywgdHJhbnNBY2MpICU+JQogIGRwbHlyOjptdXRhdGUoU3BlYWtlciA9IGFzLmZhY3RvcihTcGVha2VyKSwKICAgICAgICAgICAgICAgIEV0aW9sb2d5ID0gYXMuZmFjdG9yKEV0aW9sb2d5KSwKICAgICAgICAgICAgICAgIFNleCA9IGFzLmZhY3RvcihTZXgpKSAlPiUKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKGNvbHMgPSBWQVM6dHJhbnNBY2MsIG5hbWVzX3RvID0gIkludFR5cGUiLCB2YWx1ZXNfdG8gPSAiSW50IikgJT4lCiAgZHBseXI6Om11dGF0ZShJbnRUeXBlID0gY2FzZV93aGVuKAogICAgSW50VHlwZSA9PSAidHJhbnNBY2MiIH4gIk9UIiwKICAgIFRSVUUgfiAiVkFTIgogICksCiAgICAgICAgICAgICAgICBJbnRUeXBlID0gYXMuZmFjdG9yKEludFR5cGUpKQoKeWxhYmVsIDwtICJJbnRlbGxpZ2liaWxpdHkiCm15UGFsIDwtIGMoIiMyRDJEMzciLCAiIzEyNzlCNSIpCm15UGFsU2hhcGUgPC0gYygxOSwgMSkKClZTQSA8LSBtb2RlbEZpZ3VyZURhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBJbnQsCiAgICAgIGNvbG9yID0gSW50VHlwZSwKICAgICAgc2hhcGUgPSBJbnRUeXBlLAogICAgICBsaW5ldHlwZSA9IEludFR5cGUpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVlNBIChCYXJrIl4yKiIpIikpICsKICB5bGFiKHlsYWJlbCkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGFzcGVjdC5yYXRpbz0xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15UGFsKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IG15UGFsU2hhcGUpICsKICBsYWJzKGNvbG9yPSJJbnRlbGxpZ2liaWxpdHkgVHlwZSIsCiAgICAgICBzaGFwZSA9ICJJbnRlbGxpZ2liaWxpdHkgVHlwZSIsCiAgICAgICBsaW5ldHlwZSA9ICJJbnRlbGxpZ2liaWxpdHkgVHlwZSIpCgpkaXNwIDwtIG1vZGVsRmlndXJlRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gSW50LAogICAgICBjb2xvciA9IEludFR5cGUsCiAgICAgIHNoYXBlID0gSW50VHlwZSwKICAgICAgbGluZXR5cGUgPSBJbnRUeXBlKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKCJDb3JuZXIgRGlzcGVyc2lvbiAoQmFyaykiKSArCiAgeWxhYih5bGFiZWwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBteVBhbCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBteVBhbFNoYXBlKSArCiAgbGFicyhjb2xvcj0iSW50ZWxsaWdpYmlsaXR5IFR5cGUiLAogICAgICAgc2hhcGUgPSAiSW50ZWxsaWdpYmlsaXR5IFR5cGUiLAogICAgICAgbGluZXR5cGUgPSAiSW50ZWxsaWdpYmlsaXR5IFR5cGUiKQoKSHVsbCA8LSBtb2RlbEZpZ3VyZURhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gSW50LAogICAgICBjb2xvciA9IEludFR5cGUsCiAgICAgIHNoYXBlID0gSW50VHlwZSwKICAgICAgbGluZXR5cGUgPSBJbnRUeXBlKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKGV4cHJlc3Npb24oIlZTQSJbSHVsbF0qIiAoQmFyayJeMioiKSIpKSArCiAgeWxhYih5bGFiZWwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gbXlQYWxTaGFwZSkgKwogIGxhYnMoY29sb3I9IkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIHNoYXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIGxpbmV0eXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIikKCnZzZDI1IDwtIG1vZGVsRmlndXJlRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSBJbnQsCiAgICAgIGNvbG9yID0gSW50VHlwZSwKICAgICAgc2hhcGUgPSBJbnRUeXBlLAogICAgICBsaW5ldHlwZSA9IEludFR5cGUpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVlNEIlsyNV0qIiAoQmFyayJeMioiKSIpKSArCiAgeWxhYih5bGFiZWwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gbXlQYWxTaGFwZSkgKwogIGxhYnMoY29sb3I9IkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIHNoYXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIGxpbmV0eXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIikKCnZzZDc1IDwtIG1vZGVsRmlndXJlRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfNzUsCiAgICAgIHkgPSBJbnQsCiAgICAgIGNvbG9yID0gSW50VHlwZSwKICAgICAgc2hhcGUgPSBJbnRUeXBlLAogICAgICBsaW5ldHlwZSA9IEludFR5cGUpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVlNEIls3NV0qIiAoQmFyayJeMioiKSIpKSArCiAgeWxhYih5bGFiZWwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gbXlQYWxTaGFwZSkgKwogIGxhYnMoY29sb3I9IkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIHNoYXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIGxpbmV0eXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIikKCiMgQ3JlYXRpbmcgT1QgU2NhdHRlcnBsb3QgRmlndXJlCgpzY2F0dGVyIDwtIFZTQSArIGRpc3AgKyBwYXRjaHdvcms6Omd1aWRlX2FyZWEoKSArIEh1bGwgKyB2c2QyNSArIHZzZDc1ICsKICBwYXRjaHdvcms6OnBsb3RfbGF5b3V0KGd1aWRlcyA9ICdjb2xsZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAzKQpzY2F0dGVyIAoKZ2dzYXZlKCJQbG90cy9Nb2RlbEZpZ3VyZS5wbmciLCBzY2F0dGVyLAogICAgICAgaGVpZ2h0ID0gNCwKICAgICAgIHdpZHRoID0gNiwKICAgICAgIHVuaXRzID0gImluIiwKICAgICAgIHNjYWxlID0gMS4xKQpgYGAKCiMgQWx0ZXJuYXRlIEFuYWx5c2lzCgpJbiB0aGlzIGFsdGVybmF0ZSBhbmFseXNpcywgd2UgYXJlIGxvb2tpbmcgYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZXNlIGFjb3VzdGljIG1lYXN1cmVzIHdpdGggc3BlZWNoIGludGVsbGlnaWJpbGl0eSBmb3IgdGhlIEFMUy9QRCBhbmQgdGhlIEhEL0F0YXhpYyBzcGVha2VycyBzZXBhcmF0ZWx5LiBXZSBjcmVhdGUgYSBuZXcgdmFyaWFibGUgY2FsbGVkIEluY29vcmQsIHdoZXJlIHRoZSBBTFMvUEQgU3BlYWtlcnMgYXJlIHNldCBhcyB0aGUgcmVmZXJlbmNlIGdyb3VwIChpbiBvcmRlciB0byBjb21wYXJlIHRvIHRoZSBBdGF4aWMvSEQgU3BlYWtlciBHcm91cCkuIEdyb3VwIENvbXBhcmlzb25zLCBhZGRpdGlvbmFsIGRhdGEgdmlzdWFsaXphdGlvbnMsIGFuZCBmdXJ0aGVyIGxpbmVhciBtb2RlbCBjb21wYXJpc29ucyBhcmUgY29tcGxldGVkLgoKIyMgRGF0YSBQcmVwCgpgYGB7cn0KCiMgQ3JlYXRpbmcgYSBuZXcgdmFyaWFibGUgaW4gQWNvdXN0aWNEYXRhLiBJbmNvb3JkIGlzIGEgZHVtbXkgdmFyaWFibGUuIEFMUy9QRCBTcGVha2VycyA9IDAsIEhEL0F0YXhpYyA9IDEKCkFjb3VzdGljRGF0YSA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6Om11dGF0ZShJbmNvb3JkID0gY2FzZV93aGVuKEV0aW9sb2d5ID09ICJIRCIgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdGlvbG9neSA9PSAiQXRheGljIiB+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lCiAgZHBseXI6Om11dGF0ZShJbmNvb3JkID0gYXMuZmFjdG9yKEluY29vcmQpKQoKYGBgCgojIyBEZXNjcmlwdGl2ZXMgCgpgYGB7cn0KCkRlc2NyaXB0aXZlc19BTFMuUERfaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6Omdyb3VwX2J5KEluY29vcmQpICU+JQogIGRwbHlyOjpzdW1tYXJpemUoVlNBX21lYW4gPSBtZWFuKFZTQV9iLCBuYS5ybSA9VCksIFZTQV9zZCA9IHNkKFZTQV9iLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgRGlzcF9tZWFuID0gbWVhbih2b3dlbF9FRF9iLCBuYS5ybSA9VCksIERpc3Bfc2QgPSBzZCh2b3dlbF9FRF9iLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBIdWxsX21lYW4gPSBtZWFuKEh1bGxfYiwgbmEucm0gPVQpLCBIdWxsX3NkID0gc2QoSHVsbF9iLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0QyNV9tZWFuID0gbWVhbihIdWxsX2JWU0RfMjUsIG5hLnJtID1UKSwgVlNEMjVfc2QgPSBzZChIdWxsX2JWU0RfMjUsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDUwX21lYW4gPSBtZWFuKEh1bGxfYlZTRF81MCwgbmEucm0gPVQpLCBWU0Q1MF9zZCA9IHNkKEh1bGxfYlZTRF81MCwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNENzVfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzc1LCBuYS5ybSA9VCksIFZTRDc1X3NkID0gc2QoSHVsbF9iVlNEXzc1LCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWQVNfbWVhbiA9IG1lYW4oVkFTLCBuYS5ybSA9VCksIFZBU19zZCA9IHNkKFZBUywgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgT1RfbWVhbiA9IG1lYW4odHJhbnNBY2MsIG5hLnJtID1UKSwgT1Rfc2QgPSBzZCh0cmFuc0FjYywgbmEucm0gPVQpKQoKRGVzY3JpcHRpdmVzX0FMUy5QRF9pbmNvb3JkCgpgYGAKCiMjIERhdGEgVmlzCgojIyMgR3JvdXAgQ29tcGFyaXNvbiBSaWRnZWxpbmUgUGxvdHMKCmBgYHtyfQoKIyBWU0EgUmlkZ2VsaW5lIFBsb3QgYnkgSW5jb29yZGluYXRpb24gKEluY29vcmQgPSAwIGFyZSBBTFMvUEQgU3BlYWtlcnMsIEluY29vcmQgPT0gMSBhcmUgSEQvQXRheGljIFNwZWFrZXJzKQoKVlNBX2luY29vcmQucGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBJbmNvb3JkLAogICAgICBjb2xvciA9IEluY29vcmQsCiAgICAgIGZpbGwgPSBJbmNvb3JkKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIENvcm5lciBEaXNwZXJzaW9uIFJpZGdlbGluZSBQbG90IGJ5IEluY29vcmRpbmF0aW9uIChJbmNvb3JkID0gMCBhcmUgQUxTL1BEIFNwZWFrZXJzLCBJbmNvb3JkID09IDEgYXJlIEhEL0F0YXhpYyBTcGVha2VycykKCmRpc3BfaW5jb29yZC5wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIkNvcm5lciBEaXNwZXJzaW9uIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgSHVsbCBSaWRnZWxpbmUgUGxvdCBieSBJbmNvb3JkaW5hdGlvbiAoSW5jb29yZCA9IDAgYXJlIEFMUy9QRCBTcGVha2VycywgSW5jb29yZCA9PSAxIGFyZSBIRC9BdGF4aWMgU3BlYWtlcnMpCgpodWxsX2luY29vcmQucGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBWU0QgMjUgUmlkZ2VsaW5lIFBsb3QgYnkgSW5jb29yZGluYXRpb24gKEluY29vcmQgPSAwIGFyZSBBTFMvUEQgU3BlYWtlcnMsIEluY29vcmQgPT0gMSBhcmUgSEQvQXRheGljIFNwZWFrZXJzKQoKdnNkMjVfaW5jb29yZC5wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSBJbmNvb3JkLAogICAgICBjb2xvciA9IEluY29vcmQsCiAgICAgIGZpbGwgPSBJbmNvb3JkKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVzbml0eSAyNSAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIFZTRCA1MCBSaWRnZWxpbmUgUGxvdCBieSBJbmNvb3JkaW5hdGlvbiAoSW5jb29yZCA9IDAgYXJlIEFMUy9QRCBTcGVha2VycywgSW5jb29yZCA9PSAxIGFyZSBIRC9BdGF4aWMgU3BlYWtlcnMpCgp2c2Q1MF9pbmNvb3JkLnBsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYlZTRF81MCwKICAgICAgeSA9IEluY29vcmQsCiAgICAgIGNvbG9yID0gSW5jb29yZCwKICAgICAgZmlsbCA9IEluY29vcmQpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBEZXNuaXR5IDUwIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVlNEIDc1IFJpZGdlbGluZSBQbG90IGJ5IEluY29vcmRpbmF0aW9uIChJbmNvb3JkID0gMCBhcmUgQUxTL1BEIFNwZWFrZXJzLCBJbmNvb3JkID09IDEgYXJlIEhEL0F0YXhpYyBTcGVha2VycykKCnZzZDc1X2luY29vcmQucGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlc25pdHkgNzUgKEJhcmspIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBPcnRob2dyYXBoaWMgVHJhbnNjcmlwdGlvbiBSaWRnZWxpbmUgUGxvdCBieSBJbmNvb3JkaW5hdGlvbiAoSW5jb29yZCA9IDAgYXJlIEFMUy9QRCBTcGVha2VycywgSW5jb29yZCA9PSAxIGFyZSBIRC9BdGF4aWMgU3BlYWtlcnMpCgpPVF9pbmNvb3JkLnBsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IHRyYW5zQWNjLAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVmlzdWFsIEFuYWxvZyBTY2FsZSBJbnRlbGxpZ2liaWxpdHkgUmF0aW5nIFJpZGdlbGluZSBQbG90IGJ5IEluY29vcmRpbmF0aW9uIChJbmNvb3JkID0gMCBhcmUgQUxTL1BEIFNwZWFrZXJzLCBJbmNvb3JkID09IDEgYXJlIEhEL0F0YXhpYyBTcGVha2VycykKClZBU19pbmNvb3JkLnBsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZBUywKICAgICAgeSA9IEluY29vcmQsCiAgICAgIGNvbG9yID0gSW5jb29yZCwKICAgICAgZmlsbCA9IEluY29vcmQpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJSYXRpZ25zIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBDcmVhdGluZyBEaXN0cmlidXRpb25zIGJ5IEluY29vcmQgRmlndXJlCgpEaXN0cmlidXRpb25zX2luY29vcmQgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoVlNBX2luY29vcmQucGxvdCwgZGlzcF9pbmNvb3JkLnBsb3QsIGh1bGxfaW5jb29yZC5wbG90LCB2c2QyNV9pbmNvb3JkLnBsb3QsIHZzZDUwX2luY29vcmQucGxvdCwgdnNkNzVfaW5jb29yZC5wbG90LCBPVF9pbmNvb3JkLnBsb3QsIFZBU19pbmNvb3JkLnBsb3QsCiAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgICAgICBucm93ID0gNCkKCiMgU2F2aW5nIERpc3RyaWJ1dGlvbiBGaWd1cmUKCmdnc2F2ZSgiUGxvdHMvRGlzdHJpYnV0aW9uX2luY29vcmQucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCwgdW5pdCA9ICJpbiIpCgpgYGAKCiMjIyBTY2F0dGVycGxvdHMKCmBgYHtyfQoKIyBPVCBTY2F0dGVycGxvdHMgYnkgSW5jb29yZAoKT1RfVlNBLmluY29vcmQgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZTQV9iLAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgeWxhYigiUGVyY2VudCBXb3JkcyBDb3JyZWN0IikgKwogIGdndGl0bGUoIk9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpKQoKT1RfZGlzcC5pbmNvb3JkIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiQ29ybmVyIERpc3BlcnNpb24gKEJhcmspIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpPVF9IdWxsLmluY29vcmQgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYiwKICAgICAgeSA9IHRyYW5zQWNjLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpPVF92c2QyNS5pbmNvb3JkIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSB0cmFuc0FjYywKICAgICAgY29sb3IgPSBJbmNvb3JkKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBEZW5zaXR5IDI1IChCYXJrKSIpICsKICB5bGFiKCJQZXJjZW50IFdvcmRzIENvcnJlY3QiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKT1RfdnNkNzUuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVuc2l0eSA3NSAoQmFyaykiKSArCiAgeWxhYigiUGVyY2VudCBXb3JkcyBDb3JyZWN0IikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkKCgojIFZBUyBTY2F0dGVycGxvdHMKClZBU19WU0EuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBWQVMsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgeWxhYigiVkFTIFNjb3JlIikgKwogIGdndGl0bGUoIlZpc3VhbCBBbmFsb2cgU2NhbGUiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIikpCgpWQVNfZGlzcC5pbmNvb3JkIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIkNvcm5lciBEaXNwZXJzaW9uIChCYXJrKSIpICsKICB5bGFiKCJWQVMgU2NvcmUiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKVkFTX0h1bGwuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHlsYWIoIlZBUyBTY29yZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpWQVNfdnNkMjUuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzI1LAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlbnNpdHkgMjUgKEJhcmspIikgKwogIHlsYWIoIlZBUyBTY29yZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpWQVNfdnNkNzUuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlbnNpdHkgNzUgKEJhcmspIikgKwogIHlsYWIoIlZBUyBTY29yZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgoKIyBDcmVhdGluZyBTY2F0dGVycGxvdCBGaWd1cmUKClNjYXR0ZXJwbG90c19pbmNvb3JkIDwtIGdncHVicjo6Z2dhcnJhbmdlKE9UX1ZTQS5pbmNvb3JkLCBWQVNfVlNBLmluY29vcmQsIE9UX2Rpc3AuaW5jb29yZCwgVkFTX2Rpc3AuaW5jb29yZCwgT1RfSHVsbC5pbmNvb3JkLCBWQVNfSHVsbC5pbmNvb3JkLCBPVF92c2QyNS5pbmNvb3JkLCBWQVNfdnNkMjUuaW5jb29yZCwgT1RfdnNkNzUuaW5jb29yZCwgVkFTX3ZzZDc1LmluY29vcmQsCiAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgICAgICBucm93ID0gNSkKCiMjIFNhdmluZyBTY2F0dGVycGxvdCBGaWd1cmUKCmdnc2F2ZSgiUGxvdHMvU2NhdHRlcnBsb3RzX2luY29vcmQucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAyMCwgdW5pdCA9ICJpbiIsIHNjYWxlID0gLjUpCgoKYGBgCgoKIyMgR3JvdXAgQ29tcGFyaXNvbnMKCiMjIyBUd28gRGF0YWZyYW1lcyBmb3IgSW5jb29yZCBHcm91cHMKCmBgYHtyfQoKY29vcmQuZ3JvdXAgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpmaWx0ZXIoSW5jb29yZCA9PSAwKQoKaW5jb29yZC5ncm91cCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6OmZpbHRlcihJbmNvb3JkID09IDEpCgpgYGAKCgojIyMgVlNBCgpgYGB7cn0KCiMgQXNzdW1wdGlvbiBDaGVjawoKIyMgQ2hlY2tpbmcgTm9ybWFsaXR5Cgp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KFZTQV9iW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KFZTQV9iW0luY29vcmQgPT0gMV0pKQoKIyMgRXF1YWwgVmFyaWFuY2UgQ2hlY2sKCnJlcy5mdGVzdC5WU0EgPC0gdmFyLnRlc3QoVlNBX2IgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QuVlNBCgojIE1vZGVsIFJlc3VsdHMKClZTQV9iX3QgPC0gdC50ZXN0KGluY29vcmQuZ3JvdXAkVlNBX2IsIGNvb3JkLmdyb3VwJFZTQV9iLCB2YXIuZXF1YWwgPSBUKQpWU0FfYl90CgpgYGAKCiMjIyBDb3JuZXIgRGlzcGVyc2lvbgoKYGBge3J9CgojIEFzc3VtcHRpb24gQ2hlY2sKCiMjIENoZWNraW5nIE5vcm1hbGl0eQoKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdCh2b3dlbF9FRF9iW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KHZvd2VsX0VEX2JbSW5jb29yZCA9PSAxXSkpCgojIyBFcXVhbCBWYXJpYW5jZSBDaGVjawoKcmVzLmZ0ZXN0LmRpc3AgPC0gdmFyLnRlc3Qodm93ZWxfRURfYiB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCnJlcy5mdGVzdC5kaXNwCgojIE1vZGVsIFJlc3VsdHMKCmRpc3BfdCA8LSB0LnRlc3QoaW5jb29yZC5ncm91cCR2b3dlbF9FRF9iLCBjb29yZC5ncm91cCR2b3dlbF9FRF9iLCB2YXIuZXF1YWwgPSBUKQpkaXNwX3QKCmBgYAoKIyMjIEh1bGwKCmBgYHtyfQoKIyBBc3N1bXB0aW9uIENoZWNrCgojIyBDaGVja2luZyBOb3JtYWxpdHkKCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoSHVsbF9iW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KEh1bGxfYltJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QuaHVsbCA8LSB2YXIudGVzdChIdWxsX2IgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QuaHVsbAoKIyBNb2RlbCBSZXN1bHRzCgpodWxsX3QgPC0gdC50ZXN0KGluY29vcmQuZ3JvdXAkSHVsbF9iLCBjb29yZC5ncm91cCRIdWxsX2IsIHZhci5lcXVhbCA9IFQpCmh1bGxfdAoKYGBgCgojIyMgVlNEIDI1CgpgYGB7cn0KCiMgQXNzdW1wdGlvbiBDaGVjawoKIyMgQ2hlY2tpbmcgTm9ybWFsaXR5Cgp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KEh1bGxfYlZTRF8yNVtJbmNvb3JkID09IDBdKSkKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdChIdWxsX2JWU0RfMjVbSW5jb29yZCA9PSAxXSkpCgojIyBFcXVhbCBWYXJpYW5jZSBDaGVjawoKcmVzLmZ0ZXN0LnZzZDI1IDwtIHZhci50ZXN0KEh1bGxfYlZTRF8yNSB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCnJlcy5mdGVzdC52c2QyNQoKIyBNb2RlbCBSZXN1bHRzCgp2c2QyNV90IDwtIHQudGVzdChpbmNvb3JkLmdyb3VwJEh1bGxfYlZTRF8yNSwgY29vcmQuZ3JvdXAkSHVsbF9iVlNEXzI1LCB2YXIuZXF1YWwgPSBUKQp2c2QyNV90CgpgYGAKCiMjIyBWU0QgNTAKCmBgYHtyfQoKIyBBc3N1bXB0aW9uIENoZWNrCgojIyBDaGVja2luZyBOb3JtYWxpdHkKCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoSHVsbF9iVlNEXzUwW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KEh1bGxfYlZTRF81MFtJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QudnNkNTAgPC0gdmFyLnRlc3QoSHVsbF9iVlNEXzUwIH4gSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcmVzLmZ0ZXN0LnZzZDUwCgojIE1vZGVsIFJlc3VsdHMgKE1hbm4tV2hpdG5leSBVIHRlc3QgY29uZHVjdGVkIHNpbmNlIGFzc3VtcHRpb24gb2Ygbm9ybWFsaXR5IGlzIHZpb2xhdGVkKQoKdnNkNTBfTVcgPC0gd2lsY294LnRlc3QoSHVsbF9iVlNEXzUwIH4gSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKdnNkNTBfTVcKCmBgYAoKIyMjIFZTRCA3NQoKYGBge3J9CgojIEFzc3VtcHRpb24gQ2hlY2sKCiMjIENoZWNraW5nIE5vcm1hbGl0eQoKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdChIdWxsX2JWU0RfNzVbSW5jb29yZCA9PSAwXSkpCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoSHVsbF9iVlNEXzc1W0luY29vcmQgPT0gMV0pKQoKIyMgRXF1YWwgVmFyaWFuY2UgQ2hlY2sKCnJlcy5mdGVzdC52c2Q3NSA8LSB2YXIudGVzdChIdWxsX2JWU0RfNzUgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QudnNkNzUKCiMgTW9kZWwgUmVzdWx0cyAoTWFubi1XaGl0bmV5IFUgdGVzdCBjb25kdWN0ZWQgc2luY2UgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgdmlvbGF0ZWQpCgp2c2Q3NV9NVyA8LSB3aWxjb3gudGVzdChIdWxsX2JWU0RfNzUgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQp2c2Q3NV9NVwoKCmBgYAoKIyMjIE9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIFNjb3JlcwoKYGBge3J9CgojIEFzc3VtcHRpb24gQ2hlY2sKCiMjIENoZWNraW5nIE5vcm1hbGl0eQoKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdCh0cmFuc0FjY1tJbmNvb3JkID09IDBdKSkKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdCh0cmFuc0FjY1tJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QuT1QgPC0gdmFyLnRlc3QodHJhbnNBY2MgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QuT1QKCiMgTW9kZWwgUmVzdWx0cyAoTWFubi1XaGl0bmV5IFUgdGVzdCBjb25kdWN0ZWQgc2luY2UgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgdmlvbGF0ZWQpCgpPVF9NVyA8LSB3aWxjb3gudGVzdCh0cmFuc0FjYyB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCk9UX01XCgpgYGAKCiMjIyBWQVMKCmBgYHtyfQoKIyBBc3N1bXB0aW9uIENoZWNrCgojIyBDaGVja2luZyBOb3JtYWxpdHkKCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoVkFTW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KFZBU1tJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QuVkFTIDwtIHZhci50ZXN0KFZBUyB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCnJlcy5mdGVzdC5WQVMKCiMgTW9kZWwgUmVzdWx0cyAoTWFubi1XaGl0bmV5IFUgdGVzdCBjb25kdWN0ZWQgc2luY2UgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgdmlvbGF0ZWQpCgpPVF9NVyA8LSB3aWxjb3gudGVzdChWQVMgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpPVF9NVwoKYGBgCgojIyBPVCBBbmFseXNpcwoKU2luY2Ugd2UgZm91bmQgc2lnbmlmaWNhbnQgZ3JvdXAgZGlmZmVyZW5jZXMgZm9yIHNvbWUgYWNvdXN0aWMgbWVhc3VyZXMgYmV0d2VlbiB0aGUgQUxTL1BEIGFuZCBBdGF4aWMvSEQgZ3JvdXBzLCB3ZSBjb250aW51ZWQgdGhlIGhlaXJhcmljaGFsIHJlZ3Jlc3Npb24gYXBwcm9hY2ggZnJvbSBPVCBNb2RlbCA1LiBBZGRpbmcgaW4gdGhlIEluY29vcmQgcHJlZGljdG9yIGFsb25nIHdpdGggdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBhY291c3RpYyBtZWFzdXJlcyBkaWQgbm90IHNpZ25pZmljYW50bHkgaW1wcm92ZSBtb2RlbCBmaXQuIFNvIG91ciBvcmlnaW5hbCBmaW5hbCBPVCBtb2RlbCBpcyByZXRhaW5lZC4KCiMjIyBNb2RlbCA2CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNgoKT1RfTW9kZWw2IDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDYgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsNikKCiMjIE1vZGVsIDYgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDYpCgojIyBNb2RlbCA1IGFuZCBNb2RlbCA2IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNSwgT1RfTW9kZWw2KQoKYGBgCiMjIyBNb2RlbCA3CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNwoKT1RfTW9kZWw3IDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDcgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsNykKCiMjIE1vZGVsIDcgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDcpCgojIyBNb2RlbCA2IGFuZCBNb2RlbCA3IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNiwgT1RfTW9kZWw3KQoKYGBgCgojIyMgTW9kZWwgOAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDgKCk9UX01vZGVsOCA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUgKyBJbmNvb3JkKkh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDggQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsOCkKCiMjIE1vZGVsIDggU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDgpCgojIyBNb2RlbCA3IGFuZCBNb2RlbCA4IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNywgT1RfTW9kZWw4KQoKYGBgCgojIyMgTW9kZWwgOQoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDkKCk9UX01vZGVsOSA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUgKyBJbmNvb3JkKkh1bGxfYlZTRF83NSArIEluY29vcmQqSHVsbF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgOSBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWw5KQoKIyMgTW9kZWwgOSBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsOSkKCiMjIE1vZGVsIDggYW5kIE1vZGVsIDkgQ29tcGFyaXNvbgoKYW5vdmEoT1RfTW9kZWw4LCBPVF9Nb2RlbDkpCgpgYGAKCiMjIyBNb2RlbCAxMAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDEwCgpPVF9Nb2RlbDEwIDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSArIEluY29vcmQqSHVsbF9iVlNEXzc1ICsgSW5jb29yZCpIdWxsX2IgKyBJbmNvb3JkKlZTQV9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgMTAgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsMTApCgojIyBNb2RlbCAxMCBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsMTApCgojIyBNb2RlbCA5IGFuZCBNb2RlbCAxMCBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDksIE9UX01vZGVsMTApCgpgYGAKCiMjIyBNb2RlbCAxMQptbwpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgMTEKCk9UX01vZGVsMTEgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiArIHZvd2VsX0VEX2IgKyAKICAgICAgICAgICAgICAgICAgSW5jb29yZCArIEluY29vcmQqSHVsbF9iVlNEXzI1ICsgSW5jb29yZCpIdWxsX2JWU0RfNzUgKyBJbmNvb3JkKkh1bGxfYiArIEluY29vcmQqVlNBX2IgKyBJbmNvb3JkKnZvd2VsX0VEX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAxMSBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWwxMSkKCiMjIE1vZGVsIDExIFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWwxMSkKCiMjIE1vZGVsIDEwIGFuZCBNb2RlbCAxMSBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDEwLCBPVF9Nb2RlbDExKQoKYGBgCgojIyBWQVMgQW5hbHlzaXMKClNpbmNlIHdlIGZvdW5kIHNpZ25pZmljYW50IGdyb3VwIGRpZmZlcmVuY2VzIGZvciBzb21lIGFjb3VzdGljIG1lYXN1cmVzIGJldHdlZW4gdGhlIEFMUy9QRCBhbmQgQXRheGljL0hEIGdyb3Vwcywgd2UgY29udGludWVkIHRoZSBoaWVyYXJjaGljYWwgcmVncmVzc2lvbiBhcHByb2FjaCBmcm9tIFZBUyBNb2RlbCA1LiBWQVMgTW9kZWwgNiBmaXQgc2lnbmlmaWNhbnRseSBiZXR0ZXIgdGhhbiBWQVMgTW9kZWwgNS4gSG93ZXZlciwgYWRkaW5nIGluIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBJbmNvb3JkIGFuZCB0aGUgYWNvdXN0aWMgbWVhc3VyZXMgZGlkIG5vdCBzaWduaWZpY2FudGx5IGltcHJvdmUgbW9kZWwgZml0LgoKIyMjIE1vZGVsIDYKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCA2CgpWQVNfTW9kZWw2IDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA2IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWw2KQoKIyMgTW9kZWwgNiBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDYpCgojIyBNb2RlbCA1IGFuZCBNb2RlbCA2IENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDUsIFZBU19Nb2RlbDYpCgoKYGBgCgojIyMgTW9kZWwgNwoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDcKClZBU19Nb2RlbDcgPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDcgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDcpCgojIyBNb2RlbCA3IFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsNykKCiMjIE1vZGVsIDYgYW5kIE1vZGVsIDcgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsNiwgVkFTX01vZGVsNykKCgpgYGAKCiMjIyBNb2RlbCA4CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgOAoKVkFTX01vZGVsOCA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiArIHZvd2VsX0VEX2IgKyAKICAgICAgICAgICAgICAgICAgSW5jb29yZCArIEluY29vcmQqSHVsbF9iVlNEXzI1ICsgSW5jb29yZCpIdWxsX2JWU0RfNzUsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA4IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWw4KQoKIyMgTW9kZWwgOCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDgpCgojIyBNb2RlbCA3IGFuZCBNb2RlbCA4IENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDcsIFZBU19Nb2RlbDgpCgoKYGBgCgojIyMgTW9kZWwgOQoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDkKClZBU19Nb2RlbDkgPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSArIEluY29vcmQqSHVsbF9iVlNEXzc1ICsgSW5jb29yZCpIdWxsX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA5IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWw5KQoKIyMgTW9kZWwgOSBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDkpCgojIyBNb2RlbCA4IGFuZCBNb2RlbCA5IENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDgsIFZBU19Nb2RlbDkpCgpgYGAKCiMjIyBNb2RlbCAxMAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDEwCgpWQVNfTW9kZWwxMCA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiArIHZvd2VsX0VEX2IgKyAKICAgICAgICAgICAgICAgICAgSW5jb29yZCArIEluY29vcmQqSHVsbF9iVlNEXzI1ICsgSW5jb29yZCpIdWxsX2JWU0RfNzUgKyBJbmNvb3JkKkh1bGxfYiArIEluY29vcmQqVlNBX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAxMCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsMTApCgojIyBNb2RlbCAxMCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDEwKQoKIyMgTW9kZWwgOSBhbmQgTW9kZWwgMTAgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsOSwgVkFTX01vZGVsMTApCgpgYGAKIyMjIE1vZGVsIDExCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgMTEKClZBU19Nb2RlbDExIDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUgKyBJbmNvb3JkKkh1bGxfYlZTRF83NSArIEluY29vcmQqSHVsbF9iICsgSW5jb29yZCpWU0FfYiArIEluY29vcmQqdm93ZWxfRURfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDExIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWwxMSkKCiMjIE1vZGVsIDExIFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsMTEpCgojIyBNb2RlbCAxMCBhbmQgTW9kZWwgMTEgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsMTAsIFZBU19Nb2RlbDExKQoKYGBgCgojIyMgTmV3IEZpbmFsIFZBUyBNb2RlbAoKU2luY2UgVkFTIE1vZGVsIDYgd2FzIHNpZ25pZmljYW50bHkgYmV0dGVyIGZpdCB0aGFuIE1vZGVsIDUsIHdlIGZpdCBhIG5ldyBmaW5hbCBwYXJzaW1vbmlvdXMgbW9kZWwgZm9yIFZBUyB0byB0aGUgZGF0YSAoVkFTIH4gVlNBX2IgKyBJbmNvb3JkKSBhbmQgY29tcGFyZWQgdGhhdCB0byB0aGUgb2xkIGZpbmFsIFZBUyBtb2RlbCAoVkFTIH4gVlNBX2IpLiBUaGUgbmV3IGZpbmFsIG1vZGVsIHdhcyBub3QgYSBzaWduaWZpY2FudGx5IGJldHRlciBmaXQgdGhhbiB0aGUgb2xkIGZpbmFsIG1vZGVsLiBUaHVzIHRoZSBvbGQgZmluYWwgbW9kZWwgKFZBUyB+IFZTQV9iKSBpcyByZXRhaW5lZC4KCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBOZXcgRmluYWwgVkFTIE1vZGVsCgpWQVNfTW9kZWxfbmV3ZmluYWwgPC0gbG0oVkFTIH4gVlNBX2IgKyBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTmV3IEZpbmFsIFZBUyBNb2RlbCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsX25ld2ZpbmFsKQoKIyMgTmV3IEZpbmFsIFZBUyBNb2RlbCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbF9uZXdmaW5hbCkKCiMjIENvbXBhcmlzb24gdG8gT2xkIEZpbmFsIE1vZGVsCgphbm92YShWQVNfTW9kZWxfZmluYWwsIFZBU19Nb2RlbF9uZXdmaW5hbCkKCmBgYAoKIyMgVGVzdGluZyBJbmRpdmlkdWFsIFByZWRpY3RvcnMKCkJlY2F1c2Ugc29tZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwcmVkaWN0b3JzIGFyZSBoaWdoLiBXZSBydW4gYSBzZXJpZXMgb2Ygc2ltcGxlIGxpbmVhciByZWdyZXNzaW9ucyB0byB0ZXN0IGlmIHRoZSBwcmVkaWN0b3JzIHNpZ25pZmljYW50bHkgcHJlZGljdCBlYWNoIGludGVsbGlnaWJpbGl0eSBtZWFzdXJlIG9uIHRoZWlyIG93biAoVlNEIDI1IGFuZCBWU0EgbW9kZWxzIHdlcmUgYWxyZWFkeSBjb21wbGV0ZSBpbiBvdXIgaW5pdGlhbCBtb2RlbCBjb21wYXJpc29uIGFwcHJvYWNoKQoKIyMjIE9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIE1vZGVscwoKYGBge3J9CgojIE9UIH4gVlNEIDc1CgpPVF92c2Q3NV9tb2RlbCA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX3ZzZDc1X21vZGVsKQpzdW1tYXJ5KE9UX3ZzZDc1X21vZGVsKQoKIyBPVCB+IEh1bGwKCk9UX2h1bGxfbW9kZWwgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9odWxsX21vZGVsKQpzdW1tYXJ5KE9UX2h1bGxfbW9kZWwpCgojIE9UIH4gQ29ybmVyIERpc3BlcnNpb24KCk9UX2Rpc3BfbW9kZWwgPC0gbG0odHJhbnNBY2MgfiB2b3dlbF9FRF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfZGlzcF9tb2RlbCkKc3VtbWFyeShPVF9kaXNwX21vZGVsKQoKYGBgCgojIyMgVkFTIE1vZGVscwoKYGBge3J9CgojIFZBUyB+IFZTRCA3NQoKVkFTX3ZzZDc1X21vZGVsIDwtIGxtKFZBUyB+IEh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU192c2Q3NV9tb2RlbCkKc3VtbWFyeShWQVNfdnNkNzVfbW9kZWwpCgojIFZBUyB+IEh1bGwKClZBU19odWxsX21vZGVsIDwtIGxtKFZBUyB+IEh1bGxfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19odWxsX21vZGVsKQpzdW1tYXJ5KFZBU19odWxsX21vZGVsKQoKIyBWQVMgfiBDb3JuZXIgRGlzcGVyc2lvbgoKVkFTX2Rpc3BfbW9kZWwgPC0gbG0oVkFTIH4gdm93ZWxfRURfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19kaXNwX21vZGVsKQpzdW1tYXJ5KFZBU19kaXNwX21vZGVsKQoKCmBgYAojIExpc3RlbmVyIERlbW9ncmFwaGljIEluZm9ybWF0aW9uCgpgYGB7cn0KCkxpc3RlbmVyRGVtbyA8LSBMaXN0ZW5lcnMgJT4lCiAgZnVybml0dXJlOjp0YWJsZTEoYWdlLCBnZW5kZXIsIHJhY2UsIGV0aG5pY2l0eSkKCkxpc3RlbmVyRGVtbwoKYGBgCgojIFNwZWFrZXIgRGVtb2dyYXBoaWNzCgpgYGB7cn0KClNwZWFrZXJEZW1vIDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoU3BlYWtlciwgU2V4LCBFdGlvbG9neSkpCgpBZ2VzIDwtIHJpbzo6aW1wb3J0KCJQcmVwcGVkIERhdGEvU3BlYWtlciBBZ2VzLnhsc3giKQoKU3BlYWtlckRlbW8gPC0gZnVsbF9qb2luKFNwZWFrZXJEZW1vLCBBZ2VzLCBieSA9ICJTcGVha2VyIikKClNwZWFrZXJEZW1vSW5mbyA8LSBTcGVha2VyRGVtbyAlPiUKICBmdXJuaXR1cmU6OnRhYmxlMShTZXgsIEV0aW9sb2d5LCBBZ2UsIG5hLnJtID0gRikKClNwZWFrZXJEZW1vSW5mbwoKU3BlYWtlckRlbW8gJT4lCiAgZHBseXI6OnN1bW1hcml6ZShtZWFuX2FnZSA9IG1lYW4oQWdlLCBuYS5ybSA9IFQpLCBhZ2Vfc2QgPSBzZChBZ2UsIG5hLnJtID0gVCksIGFnZV9yYW5nZSA9IHJhbmdlKEFnZSwgbmEucm0gPSBUKSkKCmBgYAoK